General Setup


Create a new analysis directories.

- general directory

- for plots

- for output of summary results

- for baseline tables

- for genetic analyses

- for Cox regression results
source("scripts/functions.R")
source("scripts/pack03.packages.R")
Update all/some/none? [a/s/n]: Update all/some/none? [a/s/n]: 
n

Today = format(as.Date(as.POSIXlt(Sys.time())), "%Y%m%d")
Today.Report = format(as.Date(as.POSIXlt(Sys.time())), "%A, %B %d, %Y")

source("scripts/colors.R")

ERA-CVD ‘druggable-MI-targets’

For the ERA-CVD ‘druggable-MI-targets’ project (grantnumber: 01KL1802) we performed two related RNA sequencing (RNAseq) experiments:

  1. conventional (‘bulk’) RNAseq using RNA extracted from carotid plaque samples, n ± 700. As of Wednesday, June 14, 2023 all samples have been selected and RNA has been extracted; quality control (QC) was performed and we have a dataset of 635 samples.

  2. single-cell RNAseq (scRNAseq) of at least n = 40 samples (20 females, 20 males). As of Wednesday, June 14, 2023 data is available of 40 samples (3 females, 15 males), we are extending sampling to get more female samples.

Plaque samples are derived from carotid endarterectomies as part of the Athero-Express Biobank Study which is an ongoing study in the UMC Utrecht.

Background

Here we map the PCSK9 to single-cells from the plaques.

Targets

Here we obtain data from the PCSK9 in plaques.

library(openxlsx)

gene_list_df <- read.xlsx(paste0(PROJECT_loc, "/targets/targets.xlsx"), sheet = "Genes")

gene_list <- unlist(gene_list_df$Gene)
gene_list
[1] "CXCL10" "PCSK9"  "COL4A1" "COL4A2" "COL3A"  "COL2A"  "LDLR"   "CD36"  

Load data

First we will load the data:

  • scRNAseq experimental data and rename the cell types.
  • Athero-Express clinical data.

Here we load the latest dataset from our Athero-Express single-cell RNA experiment.


# load(paste0(AESCRNA_loc, "/20210811.46.patients.KP.RData"))
# scRNAseqData <- seuset
# rm(seuset)
# 
# saveRDS(scRNAseqData, paste0(AESCRNA_loc, "/20210811.46.patients.KP.RDS"))

scRNAseqData <- readRDS(paste0(AESCRNA_loc, "/20210811.46.patients.KP.RDS"))

scRNAseqData
An object of class Seurat 
36147 features across 4948 samples within 2 assays 
Active assay: RNA (20111 features, 0 variable features)
 1 other assay present: SCT
 2 dimensional reductions calculated: pca, umap

The naming/classification is based on a combination conventional markers. We do not claim to know the exact identity of each cell, rather we refer to cells as ‘KIT+ Mast cells”-like cells. Likewise we refer to the cell clusters as ’communities’ of cells that exhibit similar properties, i.e. similar defining markers (e.g. KIT).

We will rename the cell types to human readable names.

### change names for clarity
backup.scRNAseqData = scRNAseqData
# get the old names to change to new names
UMAPPlot(scRNAseqData, label = FALSE, pt.size = 1.25, label.size = 4, group.by = "ident")

unique(scRNAseqData@active.ident)
 [1] CD3+ T Cells I                                 CD3+ T Cells IV                                CD34+ Endothelial Cells I                     
 [4] CD3+ T Cells V                                 CD3+CD56+ NK Cells II                          CD3+ T Cells VI                               
 [7] CD68+IL18+TLR4+TREM2+ Resident macrophages     CD3+CD56+ NK Cells I                           ACTA2+ Smooth Muscle Cells                    
[10] CD3+ T Cells II                                FOXP3+ T Cells                                 CD34+ Endothelial Cells II                    
[13] CD3+ T Cells III                               CD68+CD1C+ Dendritic Cells                     CD68+CASP1+IL1B+SELL+ Inflammatory macrophages
[16] CD79A+ Class-switched Memory B Cells           CD68+ABCA1+OLR1+TREM2+ Foam Cells              CD68+KIT+ Mast Cells                          
[19] CD68+CD4+ Monocytes                            CD79+ Plasma B Cells                          
20 Levels: CD3+ T Cells I CD3+ T Cells II CD3+ T Cells III CD3+ T Cells IV CD68+IL18+TLR4+TREM2+ Resident macrophages ACTA2+ Smooth Muscle Cells ... CD79+ Plasma B Cells
celltypes <- c("CD68+CD4+ Monocytes" = "CD68+CD4+ Mono", 
               "CD68+IL18+TLR4+TREM2+ Resident macrophages" = "CD68+IL18+TLR4+TREM2+ MRes", 
               "CD68+CD1C+ Dendritic Cells" = "CD68+CD1C+ DC",
               "CD68+CASP1+IL1B+SELL+ Inflammatory macrophages" = "CD68+CASP1+IL1B+SELL MInf",
               "CD68+ABCA1+OLR1+TREM2+ Foam Cells" = "CD68+ABCA1+OLR1+TREM2+ FC",
               
               # T-cells
               "CD3+ T Cells I" = "CD3+ TC I",
               "CD3+ T Cells II" = "CD3+ TC II", 
               "CD3+ T Cells III" = "CD3+ TC III", 
               "CD3+ T Cells IV" = "CD3+ TC IV", 
               "CD3+ T Cells V" = "CD3+ TC V", 
               "CD3+ T Cells VI" = "CD3+ TC VI", 
               "FOXP3+ T Cells" = "FOXP3+ TC",
               
               # Endothelial cells
               "CD34+ Endothelial Cells I" = "CD34+ EC I", 
               "CD34+ Endothelial Cells II" = "CD34+ EC II", 
               
               # SMC
               "ACTA2+ Smooth Muscle Cells" = "ACTA2+ SMC", 
               
               # NK Cells
               "CD3+CD56+ NK Cells I" = "CD3+CD56+ NK I",
               "CD3+CD56+ NK Cells II" = "CD3+CD56+ NK II",
               # Mast
               "CD68+KIT+ Mast Cells" = "CD68+KIT+ MC",
               
               "CD79A+ Class-switched Memory B Cells" = "CD79A+ BCmem", 
               "CD79+ Plasma B Cells" = "CD79+ BCplasma")

scRNAseqData <- Seurat::RenameIdents(object = scRNAseqData, 
                                       celltypes)
UMAPPlot(scRNAseqData, label = TRUE, pt.size = 1.25, label.size = 4, group.by = "ident",
         repel = TRUE)

Clinical data

Loading the Athero-Express clinical data.


AEDB.CEA <- readRDS(file = paste0(OUT_loc, "/20230614.",PROJECTNAME,".AEDB.CEA.RDS"))

# Baseline table variables
basetable_vars = c("Hospital", "ORyear", "Artery_summary",
                   "Age", "Gender", 
                   # "TC_finalCU", "LDL_finalCU", "HDL_finalCU", "TG_finalCU", 
                   "TC_final", "LDL_final", "HDL_final", "TG_final", 
                   # "hsCRP_plasma",
                   "systolic", "diastoli", "GFR_MDRD", "BMI", 
                   "KDOQI", "BMI_WHO",
                   "SmokerStatus", "AlcoholUse",
                   "DiabetesStatus", 
                   "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs", 
                   "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD", 
                   "Stroke_Dx", "sympt", "Symptoms.5G", "AsymptSympt", "AsymptSympt2G",
                   "Symptoms.Update2G", "Symptoms.Update3G", "indexsymptoms_latest_4g",
                   "restenos", "stenose", 
                   "CAD_history", "PAOD", "Peripheral.interv", 
                   "EP_composite", "EP_composite_time", "EP_major", "EP_major_time",
                   "MAC_rankNorm", "SMC_rankNorm", "Macrophages.bin", "SMC.bin",
                   "Neutrophils_rankNorm", "MastCells_rankNorm",
                   "IPH.bin", "VesselDensity_rankNorm",
                   "Calc.bin", "Collagen.bin", 
                   "Fat.bin_10", "Fat.bin_40", "OverallPlaquePhenotype", "Plaque_Vulnerability_Index",
                   "PCSK9_plasma", "PCSK9_plasma_rankNorm")

basetable_bin = c("Gender",  "Artery_summary",
                  "KDOQI", "BMI_WHO",
                  "SmokerStatus", "AlcoholUse",
                  "DiabetesStatus", 
                  "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs", 
                  "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD", 
                  "Stroke_Dx", "sympt", "Symptoms.5G", "AsymptSympt", "AsymptSympt2G",
                  "Symptoms.Update2G", "Symptoms.Update3G", "indexsymptoms_latest_4g",
                  "restenos", "stenose",
                  "CAD_history", "PAOD", "Peripheral.interv", 
                  "EP_major", "EP_composite", "Macrophages.bin", "SMC.bin",
                  "IPH.bin", 
                  "Calc.bin", "Collagen.bin", 
                  "Fat.bin_10", "Fat.bin_40", "OverallPlaquePhenotype", "Plaque_Vulnerability_Index")
# basetable_bin

basetable_con = basetable_vars[!basetable_vars %in% basetable_bin]
# basetable_con

AESCRNA: baseline characteristics

Preparation

metadata <- scRNAseqData@meta.data %>% as_tibble() %>% separate(orig.ident, c("Patient", NA))
scRNAseqDataMeta <- metadata %>% distinct(Patient, .keep_all = TRUE)
distinct: removed 4,902 rows (99%), 46 rows remaining
scRNAseqDataMetaAE <- merge(scRNAseqDataMeta, AEDB.CEA, by.x = "Patient", by.y = "STUDY_NUMBER", sort = FALSE, all.x = TRUE)
dim(scRNAseqDataMetaAE)
[1]   46 1231
# Replace missing data 
# Ref: https://cran.r-project.org/web/packages/naniar/vignettes/replace-with-na.html
require(naniar)

na_strings <- c("NA", "N A", "N / A", "N/A", "N/ A", 
                "Not Available", "Not available", 
                "missing", 
                "-999", "-99", 
                "No data available/missing", "No data available/Missing")
# Then you write ~.x %in% na_strings - which reads as “does this value occur in the list of NA strings”.

scRNAseqDataMetaAE %>%
  replace_with_na_all(condition = ~.x %in% na_strings)
cat("====================================================================================================")
====================================================================================================
cat("SELECTION THE SHIZZLE")
SELECTION THE SHIZZLE
cat("- sanity checking PRIOR to selection")
- sanity checking PRIOR to selection
library(data.table)
require(labelled)
ae.gender <- to_factor(scRNAseqDataMetaAE$Gender)
ae.hospital <- to_factor(scRNAseqDataMetaAE$Hospital)
table(ae.gender, ae.hospital, dnn = c("Sex", "Hospital"), useNA = "ifany")
        Hospital
Sex      St. Antonius, Nieuwegein UMC Utrecht <NA>
  female                        0          19    0
  male                          0          26    0
  <NA>                          0           0    1
ae.artery <- to_factor(scRNAseqDataMetaAE$Artery_summary)
table(ae.artery, ae.gender, dnn = c("Sex", "Artery"), useNA = "ifany")
                                                                                         Artery
Sex                                                                                       female male <NA>
  No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA      0    0    0
  carotid (left & right)                                                                      19   25    0
  femoral/iliac (left, right or both sides)                                                    0    0    0
  other carotid arteries (common, external)                                                    0    1    0
  carotid bypass and injury (left, right or both sides)                                        0    0    0
  aneurysmata (carotid & femoral)                                                              0    0    0
  aorta                                                                                        0    0    0
  other arteries (renal, popliteal, vertebral)                                                 0    0    0
  femoral bypass, angioseal and injury (left, right or both sides)                             0    0    0
  <NA>                                                                                         0    0    1
ae.ic <- to_factor(scRNAseqDataMetaAE$informedconsent)
table(ae.ic, ae.gender, useNA = "ifany")
                                                                                                 ae.gender
ae.ic                                                                                             female male <NA>
  missing                                                                                              0    0    0
  no, died                                                                                             0    0    0
  yes                                                                                                  9   14    0
  yes, health treatment when possible                                                                  5    7    0
  yes, no health treatment                                                                             2    2    0
  yes, no health treatment, no commercial business                                                     1    2    0
  yes, no tissue, no commerical business                                                               0    0    0
  yes, no tissue, no questionnaires, no medical info, no commercial business                           0    0    0
  yes, no questionnaires, no health treatment, no commercial business                                  0    0    0
  yes, no questionnaires, health treatment when possible                                               0    0    0
  yes, no tissue, no questionnaires, no health treatment, no commerical business                       0    0    0
  yes, no health treatment, no medical info, no commercial business                                    0    0    0
  yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business      0    0    0
  yes, no questionnaires, no health treatment                                                          0    0    0
  yes, no tissue, no health treatment                                                                  0    0    0
  yes, no tissue, no questionnaires                                                                    0    0    0
  yes, no tissue, health treatment when possible                                                       0    0    0
  yes, no tissue                                                                                       0    0    0
  yes, no commerical business                                                                          1    1    0
  yes, health treatment when possible, no commercial business                                          0    0    0
  yes, no medical info, no commercial business                                                         0    0    0
  yes, no questionnaires                                                                               0    0    0
  yes, no tissue, no questionnaires, no health treatment, no medical info                              0    0    0
  yes, no tissue, no questionnaires, no health treatment, no commercial business                       0    0    0
  yes, no medical info                                                                                 0    0    0
  yes, no questionnaires, no commercial business                                                       0    0    0
  yes, no questionnaires, no health treatment, no medical info                                         0    0    0
  yes, no questionnaires, health treatment when possible, no commercial business                       0    0    0
  yes,  no health treatment, no medical info                                                           0    0    0
  no, doesn't want to                                                                                  0    0    0
  no, unable to sign                                                                                   0    0    0
  no, no reaction                                                                                      0    0    0
  no, lost                                                                                             0    0    0
  no, too old                                                                                          0    0    0
  yes, no medical info, health treatment when possible                                                 1    0    0
  no (never asked for IC because there was no tissue)                                                  0    0    0
  yes, no medical info, no commercial business, health treatment when possible                         0    0    0
  no, endpoint                                                                                         0    0    0
  wil niets invullen, wel alles gebruiken                                                              0    0    0
  second informed concents: yes, no commercial business                                                0    0    0
  nooit geincludeerd                                                                                   0    0    0
  yes, not outside EU                                                                                  0    0    0
  yes, no DNA                                                                                          0    0    0
  <NA>                                                                                                 0    0    1
rm(ae.gender, ae.hospital, ae.artery, ae.ic)


scRNAseqDataMetaAE.all <- subset(scRNAseqDataMetaAE,
                                 (Artery_summary == "carotid (left & right)" | Artery_summary == "other carotid arteries (common, external)" ) & # we only want carotids
                                   informedconsent != "missing" & # we are really strict in selecting based on 'informed consent'!
                                   informedconsent != "no, died" &
                                   informedconsent != "yes, no tissue, no commerical business" &
                                   informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" &
                                   informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" &
                                   informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" &
                                   informedconsent != "yes, no tissue, no health treatment" &
                                   informedconsent != "yes, no tissue, no questionnaires" &
                                   informedconsent != "yes, no tissue, health treatment when possible" &
                                   informedconsent != "yes, no tissue" &
                                   informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info" &
                                   informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" &
                                   informedconsent != "no, doesn't want to" &
                                   informedconsent != "no, unable to sign" &
                                   informedconsent != "no, no reaction" &
                                   informedconsent != "no, lost" &
                                   informedconsent != "no, too old" &
                                   informedconsent != "yes, no medical info, health treatment when possible" & 
                                   informedconsent != "no (never asked for IC because there was no tissue)" &
                                   informedconsent != "no, endpoint" &
                                   informedconsent != "nooit geincludeerd" & 
                                   informedconsent != "yes, no health treatment, no commercial business" & # IMPORTANT: since we are sharing with a commercial party
                                   informedconsent != "yes, no tissue, no commerical business" & 
                                   informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" & 
                                   informedconsent != "yes, no questionnaires, no health treatment, no commercial business" & 
                                   informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" & 
                                   informedconsent != "yes, no health treatment, no medical info, no commercial business" & 
                                   informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" & 
                                   informedconsent != "yes, no commerical business" & 
                                   informedconsent != "yes, health treatment when possible, no commercial business" & 
                                   informedconsent != "yes, no medical info, no commercial business" & 
                                   informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" & 
                                   informedconsent != "yes, no questionnaires, no commercial business" & 
                                   informedconsent != "yes, no questionnaires, health treatment when possible, no commercial business" & 
                                   informedconsent != "second informed concents: yes, no commercial business")
# scRNAseqDataMetaAE.all[1:10, 1:10]
dim(scRNAseqDataMetaAE.all)
[1]   39 1231
# DT::datatable(scRNAseqDataMetaAE.all)

Baseline

Showing the baseline table for the scRNAseq data in 39 CEA patients with informed consent.

cat("===========================================================================================")
===========================================================================================
cat("CREATE BASELINE TABLE")
CREATE BASELINE TABLE
# Create baseline tables
# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
scRNAseqDataMetaAE.all.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                                  # factorVars = basetable_bin,
                                                  # strata = "Gender",
                                                  data = scRNAseqDataMetaAE.all, includeNA = TRUE), 
                                   nonnormal = c(), 
                                   quote = FALSE, showAllLevels = TRUE,
                                   format = "p", 
                                   contDigits = 3)[,1:2]
Warning: These variables only have NA/NaN: MAC_rankNorm SMC_rankNorm Neutrophils_rankNorm MastCells_rankNorm IPH.bin VesselDensity_rankNorm PCSK9_plasma PCSK9_plasma_rankNorm  Dropped
                                     
                                      level                                                                                   Overall           
  n                                                                                                                                39           
  Hospital (%)                        St. Antonius, Nieuwegein                                                                    0.0           
                                      UMC Utrecht                                                                               100.0           
  ORyear (%)                          No data available/missing                                                                   0.0           
                                      2002                                                                                        0.0           
                                      2003                                                                                        0.0           
                                      2004                                                                                        0.0           
                                      2005                                                                                        0.0           
                                      2006                                                                                        0.0           
                                      2007                                                                                        0.0           
                                      2008                                                                                        0.0           
                                      2009                                                                                        0.0           
                                      2010                                                                                        0.0           
                                      2011                                                                                        0.0           
                                      2012                                                                                        0.0           
                                      2013                                                                                        0.0           
                                      2014                                                                                        0.0           
                                      2015                                                                                        0.0           
                                      2016                                                                                        0.0           
                                      2017                                                                                        0.0           
                                      2018                                                                                       51.3           
                                      2019                                                                                       35.9           
                                      2020                                                                                       10.3           
                                      2021                                                                                        2.6           
                                      2022                                                                                        0.0           
  Artery_summary (%)                  No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA     0.0           
                                      carotid (left & right)                                                                     97.4           
                                      femoral/iliac (left, right or both sides)                                                   0.0           
                                      other carotid arteries (common, external)                                                   2.6           
                                      carotid bypass and injury (left, right or both sides)                                       0.0           
                                      aneurysmata (carotid & femoral)                                                             0.0           
                                      aorta                                                                                       0.0           
                                      other arteries (renal, popliteal, vertebral)                                                0.0           
                                      femoral bypass, angioseal and injury (left, right or both sides)                            0.0           
  Age (mean (SD))                                                                                                              72.077 (8.183)   
  Gender (%)                          female                                                                                     41.0           
                                      male                                                                                       59.0           
  TC_final (mean (SD))                                                                                                          4.533 (1.252)   
  LDL_final (mean (SD))                                                                                                         2.676 (1.013)   
  HDL_final (mean (SD))                                                                                                         1.135 (0.229)   
  TG_final (mean (SD))                                                                                                          1.927 (1.093)   
  systolic (mean (SD))                                                                                                        150.842 (27.013)  
  diastoli (mean (SD))                                                                                                         79.711 (16.432)  
  GFR_MDRD (mean (SD))                                                                                                         79.036 (31.777)  
  BMI (mean (SD))                                                                                                              26.332 (3.962)   
  KDOQI (%)                           No data available/missing                                                                   0.0           
                                      Normal kidney function                                                                     28.2           
                                      CKD 2 (Mild)                                                                               33.3           
                                      CKD 3 (Moderate)                                                                           28.2           
                                      CKD 4 (Severe)                                                                              0.0           
                                      CKD 5 (Failure)                                                                             0.0           
                                      <NA>                                                                                       10.3           
  BMI_WHO (%)                         No data available/missing                                                                   0.0           
                                      Underweight                                                                                 2.6           
                                      Normal                                                                                     33.3           
                                      Overweight                                                                                 38.5           
                                      Obese                                                                                      17.9           
                                      <NA>                                                                                        7.7           
  SmokerStatus (%)                    Current smoker                                                                             28.2           
                                      Ex-smoker                                                                                  53.8           
                                      Never smoked                                                                               12.8           
                                      <NA>                                                                                        5.1           
  AlcoholUse (%)                      No                                                                                         38.5           
                                      Yes                                                                                        53.8           
                                      <NA>                                                                                        7.7           
  DiabetesStatus (%)                  Control (no Diabetes Dx/Med)                                                               71.8           
                                      Diabetes                                                                                   28.2           
  Hypertension.selfreport (%)         No data available/missing                                                                   0.0           
                                      no                                                                                          7.7           
                                      yes                                                                                        87.2           
                                      <NA>                                                                                        5.1           
  Hypertension.selfreportdrug (%)     No data available/missing                                                                   0.0           
                                      no                                                                                          7.7           
                                      yes                                                                                        87.2           
                                      <NA>                                                                                        5.1           
  Hypertension.composite (%)          No data available/missing                                                                   0.0           
                                      no                                                                                          7.7           
                                      yes                                                                                        92.3           
  Hypertension.drugs (%)              No data available/missing                                                                   0.0           
                                      no                                                                                         10.3           
                                      yes                                                                                        84.6           
                                      <NA>                                                                                        5.1           
  Med.anticoagulants (%)              No data available/missing                                                                   0.0           
                                      no                                                                                         87.2           
                                      yes                                                                                         5.1           
                                      <NA>                                                                                        7.7           
  Med.all.antiplatelet (%)            No data available/missing                                                                   0.0           
                                      no                                                                                         20.5           
                                      yes                                                                                        74.4           
                                      <NA>                                                                                        5.1           
  Med.Statin.LLD (%)                  No data available/missing                                                                   0.0           
                                      no                                                                                         20.5           
                                      yes                                                                                        74.4           
                                      <NA>                                                                                        5.1           
  Stroke_Dx (%)                       Missing                                                                                     0.0           
                                      No stroke diagnosed                                                                        56.4           
                                      Stroke diagnosed                                                                           43.6           
  sympt (%)                           missing                                                                                     0.0           
                                      Asymptomatic                                                                               15.4           
                                      TIA                                                                                        17.9           
                                      minor stroke                                                                               25.6           
                                      Major stroke                                                                               10.3           
                                      Amaurosis fugax                                                                            15.4           
                                      Four vessel disease                                                                         0.0           
                                      Vertebrobasilary TIA                                                                        0.0           
                                      Retinal infarction                                                                          2.6           
                                      Symptomatic, but aspecific symtoms                                                          2.6           
                                      Contralateral symptomatic occlusion                                                         0.0           
                                      retinal infarction                                                                          2.6           
                                      armclaudication due to occlusion subclavian artery, CEA needed for bypass                   0.0           
                                      retinal infarction + TIAs                                                                   0.0           
                                      Ocular ischemic syndrome                                                                    7.7           
                                      ischemisch glaucoom                                                                         0.0           
                                      subclavian steal syndrome                                                                   0.0           
                                      TGA                                                                                         0.0           
  Symptoms.5G (%)                     Asymptomatic                                                                               15.4           
                                      Ocular                                                                                     23.1           
                                      Other                                                                                       2.6           
                                      Retinal infarction                                                                          5.1           
                                      Stroke                                                                                     35.9           
                                      TIA                                                                                        17.9           
  AsymptSympt (%)                     Asymptomatic                                                                               15.4           
                                      Ocular and others                                                                          30.8           
                                      Symptomatic                                                                                53.8           
  AsymptSympt2G (%)                   Asymptomatic                                                                               15.4           
                                      Symptomatic                                                                                84.6           
  Symptoms.Update2G (%)               Asymptomatic                                                                               15.4           
                                      Symptomatic                                                                                84.6           
  Symptoms.Update3G (%)               Asymptomatic                                                                               15.4           
                                      Symptomatic                                                                                84.6           
                                      Unclear                                                                                     0.0           
  indexsymptoms_latest_4g (mean (SD))                                                                                           1.769 (1.111)   
  restenos (%)                        missing                                                                                     0.0           
                                      de novo                                                                                   100.0           
                                      restenosis                                                                                  0.0           
                                      stenose bij angioseal na PTCA                                                               0.0           
  stenose (%)                         missing                                                                                     0.0           
                                      0-49%                                                                                       2.6           
                                      50-70%                                                                                     10.3           
                                      70-90%                                                                                     46.2           
                                      90-99%                                                                                     25.6           
                                      100% (Occlusion)                                                                            0.0           
                                      NA                                                                                          0.0           
                                      50-99%                                                                                      0.0           
                                      70-99%                                                                                     15.4           
                                      99                                                                                          0.0           
  CAD_history (%)                     Missing                                                                                     0.0           
                                      No history CAD                                                                             79.5           
                                      History CAD                                                                                20.5           
  PAOD (%)                            missing/no data                                                                             0.0           
                                      no                                                                                         84.6           
                                      yes                                                                                        15.4           
  Peripheral.interv (%)               no                                                                                         76.9           
                                      yes                                                                                        23.1           
  EP_composite (%)                    No data available.                                                                          0.0           
                                      No composite endpoints                                                                     82.1           
                                      Composite endpoints                                                                        12.8           
                                      <NA>                                                                                        5.1           
  EP_composite_time (mean (SD))                                                                                               522.597 (3078.209)
  EP_major (%)                        No data available.                                                                          0.0           
                                      No major events (endpoints)                                                                87.2           
                                      Major events (endpoints)                                                                    7.7           
                                      <NA>                                                                                        5.1           
  EP_major_time (mean (SD))                                                                                                   522.681 (3078.194)
  Macrophages.bin (%)                 no/minor                                                                                    2.6           
                                      moderate/heavy                                                                              0.0           
                                      <NA>                                                                                       97.4           
  SMC.bin (%)                         no/minor                                                                                    0.0           
                                      moderate/heavy                                                                              2.6           
                                      <NA>                                                                                       97.4           
  Calc.bin (%)                        no/minor                                                                                    2.6           
                                      moderate/heavy                                                                              0.0           
                                      <NA>                                                                                       97.4           
  Collagen.bin (%)                    no/minor                                                                                    0.0           
                                      moderate/heavy                                                                              2.6           
                                      <NA>                                                                                       97.4           
  Fat.bin_10 (%)                       <10%                                                                                       0.0           
                                       >10%                                                                                       2.6           
                                      <NA>                                                                                       97.4           
  Fat.bin_40 (%)                      <40%                                                                                        2.6           
                                      >40%                                                                                        0.0           
                                      <NA>                                                                                       97.4           
  OverallPlaquePhenotype (%)          atheromatous                                                                                0.0           
                                      fibroatheromatous                                                                           2.6           
                                      fibrous                                                                                     0.0           
                                      <NA>                                                                                       97.4           
  Plaque_Vulnerability_Index (%)      0                                                                                          97.4           
                                      1                                                                                           2.6           
                                      2                                                                                           0.0           
                                      3                                                                                           0.0           
                                      4                                                                                           0.0           
                                      5                                                                                           0.0           

Writing the baseline table to Excel format.

# Write basetable
require(openxlsx)
# write.xlsx(file = paste0(BASELINE_loc, "/",Today,".",PROJECTNAME,".AESCRNA.32pts.after_qc.IC_commercial.BaselineTable.xlsx"), 
#            format(as.data.frame(scRNAseqDataMetaAE.all.tableOne), digits = 5, scientific = FALSE),
#            rowNames = TRUE, colNames = TRUE, 
#            sheetName = "AESCRNA", overwrite = TRUE)
write.xlsx(file = paste0(BASELINE_loc, "/",Today,".",PROJECTNAME,".AESCRNA.CEA.39pts.after_qc.IC_academic.BaselineTable.xlsx"),
           format(as.data.frame(scRNAseqDataMetaAE.all.tableOne), digits = 5, scientific = FALSE),
           rowNames = TRUE, colNames = TRUE,
           sheetName = "AESCRNA_CEA", overwrite = TRUE)

AESCRNA

Quality control

Here review the number of cells per sample, plate, and patients. And plot the ratio’s per sample and study number.

## check stuff
cat("\nHow many cells per type ...?")

How many cells per type ...?
sort(table(scRNAseqData@meta.data$SCT_snn_res.0.8))
integer(0)
# cat("\n\nHow many cells per plate ...?")
# sort(table(scRNAseqData@meta.data$ID))

# cat("\n\nHow many cells per type per plate ...?")
# table(scRNAseqData@meta.data$SCT_snn_res.0.8, scRNAseqData@meta.data$ID)

cat("\n\nHow many cells per patient ...?")


How many cells per patient ...?
sort(table(scRNAseqData@meta.data$Patient))

4530 4675 4440 4605 4653 4472 4458 4455 4476 4587 4496 4601 4502 4501 4571 4478 4448 4477 4452 4459 4520 4602 4489 4432 4495 
   3    4    6    7   20   22   35   54   59   60   70   70   73   75   76   77   80   84   92   94   96   96   97   99  102 
4545 4558 4480 4447 4500 4513 4535 4676 4486 4470 4487 4546 4488 4521 4580 4491 4541 4450 4542 4453 4443 
 106  107  112  114  116  123  130  135  137  144  144  144  146  161  163  175  178  205  213  222  422 
cat("\n\nVisualizing these ratio's per study number and sample ...?")


Visualizing these ratio's per study number and sample ...?
UMAPPlot(scRNAseqData, label = TRUE, pt.size = 1.25, label.size = 4, group.by = "ident",
         repel = TRUE)
ggsave(paste0(PLOT_loc, "/", Today, ".UMAP.png"), plot = last_plot())
Saving 7.29 x 4.51 in image
ggsave(paste0(PLOT_loc, "/", Today, ".UMAP.ps"), plot = last_plot())
Saving 7.29 x 4.51 in image

# barplot(prop.table(x = table(scRNAseqData@active.ident, scRNAseqData@meta.data$Patient)), 
#         cex.axis = 1.0, cex.names = 0.5, las = 1,
#         col = uithof_color, xlab = "study number", legend.text = FALSE, args.legend = list(x = "bottom"))
# dev.copy(pdf, paste0(QC_loc, "/", Today, ".cell_ratios_per_sample.pdf"))
# dev.off()

# barplot(prop.table(x = table(scRNAseqData@active.ident, scRNAseqData@meta.data$ID)), 
#         cex.axis = 1.0, cex.names = 0.5, las = 2,
#         col = uithof_color, xlab = "sample ID", legend.text = FALSE, args.legend = list(x = "bottom"))
# dev.copy(pdf, paste0(QC_loc, "/", Today, ".cell_ratios_per_sample_per_plate.pdf"))
# dev.off()

Visualisations

Let’s project known cellular markers.


UMAPPlot(scRNAseqData, label = FALSE, pt.size = 1.25, label.size = 4, group.by = "ident",
         repel = TRUE)


# endothelial cells
FeaturePlot(scRNAseqData, features = c("CD34"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("EDN1"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("EDNRA", "EDNRB"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("CDH5", "PECAM1"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("ACKR1"), cols =  c("#ECECEC", "#DB003F"))


# SMC
FeaturePlot(scRNAseqData, features = c("MYH11"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("LGALS3", "ACTA2"), cols =  c("#ECECEC", "#DB003F"))


# macrophages
FeaturePlot(scRNAseqData, features = c("CD14", "CD68"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("CD36"), cols =  c("#ECECEC", "#DB003F"))


# t-cells
FeaturePlot(scRNAseqData, features = c("CD3E"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("CD4"), cols =  c("#ECECEC", "#DB003F"))

# FeaturePlot(scRNAseqData, features = c("CD8"), cols =  c("#ECECEC", "#DB003F"))

# b-cells
FeaturePlot(scRNAseqData, features = c("CD79A"), cols =  c("#ECECEC", "#DB003F"))


# mast cells
FeaturePlot(scRNAseqData, features = c("KIT"), cols =  c("#ECECEC", "#DB003F"))


# NK cells
FeaturePlot(scRNAseqData, features = c("NCAM1"), cols =  c("#ECECEC", "#DB003F"))

Targets of interest:

We check whether the targets genes were sequenced using our method. In case some genes are not available in our data we could filter them here.

target_genes <- gene_list
target_genes
[1] "CXCL10" "PCSK9"  "COL4A1" "COL4A2" "COL3A"  "COL2A"  "LDLR"   "CD36"  

This code is just an example to filter the list from genes that are not in the data.

  • COL3A ==> not found
  • COL2A ==> not found

gene_list_rm <- c("COL3A", "COL2A") 

temp = target_genes[!target_genes %in% gene_list_rm]

target_genes_qc <- c(temp)

# gene_list_qc <- gene_list
# 
# for debug
# gene_list_qc_replace <- c("MRTFA")

# target_genes_qc <- target_genes
target_genes_qc
[1] "CXCL10" "PCSK9"  "COL4A1" "COL4A2" "LDLR"   "CD36"  

Expression in cell communities

library(RColorBrewer)

p1 <- DotPlot(scRNAseqData, features = target_genes_qc,
        cols = "RdBu")

p1 + theme(axis.text.x = element_text(angle = 45, hjust=1, size = 5))

ggsave(paste0(PLOT_loc, "/", Today, ".DotPlot.Targets.png"), plot = last_plot())
ggsave(paste0(PLOT_loc, "/", Today, ".DotPlot.Targets.ps"), plot = last_plot())
ggsave(paste0(PLOT_loc, "/", Today, ".DotPlot.Targets.pdf"), plot = last_plot())


rm(p1)

# FeaturePlot(scRNAseqData, features = c(target_genes_qc),
#             cols =  c("#ECECEC", "#DB003F", "#9A3480","#1290D9"),
#             combine = TRUE)
# 
# ggsave(paste0(PLOT_loc, "/", Today, ".FeaturePlot.Targets.png"), plot = last_plot())
# ggsave(paste0(PLOT_loc, "/", Today, ".FeaturePlot.Targets.ps"), plot = last_plot())
# VlnPlot(scRNAseqData, features = "DUSP27")

# VlnPlot files
ifelse(!dir.exists(file.path(PLOT_loc, "/VlnPlot")), 
       dir.create(file.path(PLOT_loc, "/VlnPlot")), 
       FALSE)
[1] FALSE
VlnPlot_loc = paste0(PLOT_loc, "/VlnPlot")


for (GENE in target_genes_qc){
  print(paste0("Projecting the expression of ", GENE, "."))

  vp1 <-  VlnPlot(scRNAseqData, features = GENE) + 
    xlab("cell communities") + 
    ylab(bquote("normalized expression")) +
    theme(axis.title.x = element_text(color = "#000000", size = 14, face = "bold"), 
            axis.title.y = element_text(color = "#000000", size = 14, face = "bold"), 
            legend.position = "none")
    ggsave(paste0(VlnPlot_loc, "/", Today, ".VlnPlot.",GENE,".png"), plot = last_plot())
    ggsave(paste0(VlnPlot_loc, "/", Today, ".VlnPlot.",GENE,".ps"), plot = last_plot())
    ggsave(paste0(VlnPlot_loc, "/", Today, ".VlnPlot.",GENE,".pdf"), plot = last_plot())
  
  # print(vp1)
  
}
[1] "Projecting the expression of CXCL10."
Saving 7 x 7 in image
[1] "Projecting the expression of PCSK9."
[1] "Projecting the expression of COL4A1."
[1] "Projecting the expression of COL4A2."
[1] "Projecting the expression of LDLR."
[1] "Projecting the expression of CD36."

Differential expression between cell communities

Here we project genes to only the broad cell communities:

  • macrophages
  • endothelial cells
  • smooth muscle cells
  • T-cells
  • B-cells
  • Mast cells
  • NK-cells
  • Mixed cells

Macrophages

unique(scRNAseqData@active.ident)
 [1] CD3+ TC I                  CD3+ TC IV                 CD34+ EC I                 CD3+ TC V                 
 [5] CD3+CD56+ NK II            CD3+ TC VI                 CD68+IL18+TLR4+TREM2+ MRes CD3+CD56+ NK I            
 [9] ACTA2+ SMC                 CD3+ TC II                 FOXP3+ TC                  CD34+ EC II               
[13] CD3+ TC III                CD68+CD1C+ DC              CD68+CASP1+IL1B+SELL MInf  CD79A+ BCmem              
[17] CD68+ABCA1+OLR1+TREM2+ FC  CD68+KIT+ MC               CD68+CD4+ Mono             CD79+ BCplasma            
20 Levels: CD68+CD4+ Mono CD68+IL18+TLR4+TREM2+ MRes CD68+CD1C+ DC CD68+CASP1+IL1B+SELL MInf ... CD79+ BCplasma

Comparison between the macrophages cell communities (CD14/CD68+), and all other communities.


MAC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD68+CASP1+IL1B+SELL MInf", 
                                      "CD68+CD1C+ DC", 
                                      "CD68+CD4+ Mono",
                                      "CD68+IL18+TLR4+TREM2+ MRes",
                                      "CD68+ABCA1+OLR1+TREM2+ FC"), 
                          ident.2 = c(#"CD68+CASP1+IL1B+SELL MInf", 
                                      #"CD68+CD1C+ DC", 
                                      #"CD68+CD4+ Mono",
                                      #"CD68+IL18+TLR4+TREM2+ MRes",
                                      #"CD68+ABCA1+OLR1+TREM2+ FC",
                                      "CD3+ TC I",
                                      "CD3+ TC II", 
                                      "CD3+ TC III", 
                                      "CD3+ TC IV", 
                                      "CD3+ TC V", 
                                      "CD3+ TC VI", 
                                      "FOXP3+ TC", 
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "ACTA2+ SMC", 
                                      "CD3+CD56+ NK I",
                                      "CD3+CD56+ NK II", 
                                      "CD68+KIT+ MC",
                                      "CD79+ BCplasma", 
                                      "CD79A+ BCmem"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~58s          
  |++                                                | 2 % ~56s          
  |++                                                | 3 % ~55s          
  |+++                                               | 4 % ~54s          
  |+++                                               | 5 % ~53s          
  |++++                                              | 6 % ~53s          
  |++++                                              | 7 % ~52s          
  |+++++                                             | 8 % ~51s          
  |+++++                                             | 9 % ~51s          
  |++++++                                            | 10% ~50s          
  |++++++                                            | 11% ~50s          
  |+++++++                                           | 12% ~49s          
  |+++++++                                           | 13% ~49s          
  |++++++++                                          | 14% ~48s          
  |++++++++                                          | 15% ~48s          
  |+++++++++                                         | 16% ~47s          
  |+++++++++                                         | 17% ~47s          
  |++++++++++                                        | 18% ~46s          
  |++++++++++                                        | 19% ~46s          
  |+++++++++++                                       | 20% ~45s          
  |+++++++++++                                       | 21% ~45s          
  |++++++++++++                                      | 22% ~44s          
  |++++++++++++                                      | 23% ~43s          
  |+++++++++++++                                     | 24% ~43s          
  |+++++++++++++                                     | 25% ~42s          
  |++++++++++++++                                    | 26% ~42s          
  |++++++++++++++                                    | 27% ~41s          
  |+++++++++++++++                                   | 28% ~40s          
  |+++++++++++++++                                   | 29% ~40s          
  |++++++++++++++++                                  | 30% ~39s          
  |++++++++++++++++                                  | 31% ~39s          
  |+++++++++++++++++                                 | 32% ~38s          
  |+++++++++++++++++                                 | 33% ~38s          
  |++++++++++++++++++                                | 34% ~38s          
  |++++++++++++++++++                                | 35% ~37s          
  |+++++++++++++++++++                               | 36% ~37s          
  |+++++++++++++++++++                               | 37% ~36s          
  |++++++++++++++++++++                              | 38% ~36s          
  |++++++++++++++++++++                              | 39% ~35s          
  |+++++++++++++++++++++                             | 40% ~35s          
  |+++++++++++++++++++++                             | 41% ~34s          
  |++++++++++++++++++++++                            | 42% ~33s          
  |++++++++++++++++++++++                            | 43% ~33s          
  |+++++++++++++++++++++++                           | 44% ~32s          
  |+++++++++++++++++++++++                           | 45% ~32s          
  |++++++++++++++++++++++++                          | 46% ~32s          
  |++++++++++++++++++++++++                          | 47% ~31s          
  |+++++++++++++++++++++++++                         | 48% ~31s          
  |+++++++++++++++++++++++++                         | 49% ~30s          
  |++++++++++++++++++++++++++                        | 51% ~30s          
  |++++++++++++++++++++++++++                        | 52% ~29s          
  |+++++++++++++++++++++++++++                       | 53% ~28s          
  |+++++++++++++++++++++++++++                       | 54% ~28s          
  |++++++++++++++++++++++++++++                      | 55% ~27s          
  |++++++++++++++++++++++++++++                      | 56% ~26s          
  |+++++++++++++++++++++++++++++                     | 57% ~26s          
  |+++++++++++++++++++++++++++++                     | 58% ~25s          
  |++++++++++++++++++++++++++++++                    | 59% ~24s          
  |++++++++++++++++++++++++++++++                    | 60% ~24s          
  |+++++++++++++++++++++++++++++++                   | 61% ~23s          
  |+++++++++++++++++++++++++++++++                   | 62% ~23s          
  |++++++++++++++++++++++++++++++++                  | 63% ~22s          
  |++++++++++++++++++++++++++++++++                  | 64% ~21s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~21s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~20s          
  |++++++++++++++++++++++++++++++++++                | 67% ~20s          
  |++++++++++++++++++++++++++++++++++                | 68% ~19s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~18s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~18s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~17s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~17s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~16s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~15s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~15s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~14s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~14s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~13s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~12s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=57s  
DT::datatable(MAC.markers)
MAC_Volcano_TargetsA = EnhancedVolcano(MAC.markers,
    lab = rownames(MAC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Macrophage markers\n(Macrophage communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/(nrow(MAC.markers)), # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
MAC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.MAC.DEG.Targets.pdf"), 
       plot = MAC_Volcano_TargetsA)

The target results are given below and written to a file.

library(tibble)
MAC.markers <- add_column(MAC.markers, Gene = row.names(MAC.markers), .before = 1)

temp <- MAC.markers[MAC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".MAC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

Smooth muscle cells

Comparison between the smooth muscle cell communities (ACTA2+), and all other communities.


SMC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("ACTA2+ SMC"), 
                          ident.2 = c("CD68+CASP1+IL1B+SELL MInf", 
                                      "CD68+CD1C+ DC", 
                                      "CD68+CD4+ Mono",
                                      "CD68+IL18+TLR4+TREM2+ MRes",
                                      "CD68+ABCA1+OLR1+TREM2+ FC",
                                      "CD3+ TC I",
                                      "CD3+ TC II", 
                                      "CD3+ TC III", 
                                      "CD3+ TC IV", 
                                      "CD3+ TC V", 
                                      "CD3+ TC VI", 
                                      "FOXP3+ TC", 
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      #"ACTA2+ SMC", 
                                      "CD3+CD56+ NK I",
                                      "CD3+CD56+ NK II", 
                                      "CD68+KIT+ MC",
                                      "CD79+ BCplasma", 
                                      "CD79A+ BCmem"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 19s      
  |++                                                | 2 % ~01m 14s      
  |++                                                | 3 % ~01m 12s      
  |+++                                               | 4 % ~01m 11s      
  |+++                                               | 5 % ~01m 09s      
  |++++                                              | 6 % ~01m 09s      
  |++++                                              | 7 % ~01m 08s      
  |+++++                                             | 8 % ~01m 07s      
  |+++++                                             | 9 % ~01m 06s      
  |++++++                                            | 10% ~01m 05s      
  |++++++                                            | 11% ~01m 04s      
  |+++++++                                           | 12% ~01m 04s      
  |+++++++                                           | 13% ~01m 03s      
  |++++++++                                          | 14% ~01m 02s      
  |++++++++                                          | 15% ~01m 01s      
  |+++++++++                                         | 16% ~01m 00s      
  |+++++++++                                         | 17% ~60s          
  |++++++++++                                        | 18% ~59s          
  |++++++++++                                        | 19% ~58s          
  |+++++++++++                                       | 20% ~57s          
  |+++++++++++                                       | 21% ~56s          
  |++++++++++++                                      | 22% ~56s          
  |++++++++++++                                      | 23% ~55s          
  |+++++++++++++                                     | 24% ~54s          
  |+++++++++++++                                     | 26% ~53s          
  |++++++++++++++                                    | 27% ~53s          
  |++++++++++++++                                    | 28% ~52s          
  |+++++++++++++++                                   | 29% ~51s          
  |+++++++++++++++                                   | 30% ~50s          
  |++++++++++++++++                                  | 31% ~50s          
  |++++++++++++++++                                  | 32% ~49s          
  |+++++++++++++++++                                 | 33% ~48s          
  |+++++++++++++++++                                 | 34% ~48s          
  |++++++++++++++++++                                | 35% ~47s          
  |++++++++++++++++++                                | 36% ~46s          
  |+++++++++++++++++++                               | 37% ~45s          
  |+++++++++++++++++++                               | 38% ~44s          
  |++++++++++++++++++++                              | 39% ~44s          
  |++++++++++++++++++++                              | 40% ~43s          
  |+++++++++++++++++++++                             | 41% ~42s          
  |+++++++++++++++++++++                             | 42% ~42s          
  |++++++++++++++++++++++                            | 43% ~41s          
  |++++++++++++++++++++++                            | 44% ~40s          
  |+++++++++++++++++++++++                           | 45% ~39s          
  |+++++++++++++++++++++++                           | 46% ~39s          
  |++++++++++++++++++++++++                          | 47% ~39s          
  |++++++++++++++++++++++++                          | 48% ~39s          
  |+++++++++++++++++++++++++                         | 49% ~38s          
  |+++++++++++++++++++++++++                         | 50% ~37s          
  |++++++++++++++++++++++++++                        | 51% ~37s          
  |+++++++++++++++++++++++++++                       | 52% ~36s          
  |+++++++++++++++++++++++++++                       | 53% ~35s          
  |++++++++++++++++++++++++++++                      | 54% ~34s          
  |++++++++++++++++++++++++++++                      | 55% ~33s          
  |+++++++++++++++++++++++++++++                     | 56% ~01m 04s      
  |+++++++++++++++++++++++++++++                     | 57% ~01m 02s      
  |++++++++++++++++++++++++++++++                    | 58% ~60s          
  |++++++++++++++++++++++++++++++                    | 59% ~58s          
  |+++++++++++++++++++++++++++++++                   | 60% ~56s          
  |+++++++++++++++++++++++++++++++                   | 61% ~54s          
  |++++++++++++++++++++++++++++++++                  | 62% ~52s          
  |++++++++++++++++++++++++++++++++                  | 63% ~50s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~49s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~47s          
  |++++++++++++++++++++++++++++++++++                | 66% ~45s          
  |++++++++++++++++++++++++++++++++++                | 67% ~43s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~42s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~40s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~39s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~37s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~35s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~34s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~32s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~31s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~30s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~28s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~27s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~25s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~24s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~22s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~21s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~20s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~18s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~17s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~16s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~12s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 52s
DT::datatable(SMC.markers)
SMC_Volcano_TargetsA = EnhancedVolcano(SMC.markers,
    lab = rownames(SMC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "SMC markers\n(SMC communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/(nrow(SMC.markers)), # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
SMC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.SMC.DEG.Targets.pdf"), 
       plot = SMC_Volcano_TargetsA)

The target results are given below and written to a file.

library(tibble)
SMC.markers <- add_column(SMC.markers, Gene = row.names(SMC.markers), .before = 1)

temp <- SMC.markers[SMC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".SMC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

Endothelial cells

Comparison between the endothelial cell communities (CD34+), and all other communities.


EC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD34+ EC I", 
                                      "CD34+ EC II"), 
                          ident.2 = c("CD68+CASP1+IL1B+SELL MInf", 
                                      "CD68+CD1C+ DC", 
                                      "CD68+CD4+ Mono",
                                      "CD68+IL18+TLR4+TREM2+ MRes",
                                      "CD68+ABCA1+OLR1+TREM2+ FC",
                                      "CD3+ TC I",
                                      "CD3+ TC II", 
                                      "CD3+ TC III", 
                                      "CD3+ TC IV", 
                                      "CD3+ TC V", 
                                      "CD3+ TC VI", 
                                      "FOXP3+ TC", 
                                      # "CD34+ EC I", 
                                      # "CD34+ EC II",
                                      "ACTA2+ SMC", 
                                      "CD3+CD56+ NK I",
                                      "CD3+CD56+ NK II", 
                                      "CD68+KIT+ MC",
                                      "CD79+ BCplasma", 
                                      "CD79A+ BCmem"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 03s      
  |++                                                | 2 % ~01m 01s      
  |++                                                | 3 % ~60s          
  |+++                                               | 4 % ~59s          
  |+++                                               | 5 % ~59s          
  |++++                                              | 6 % ~58s          
  |++++                                              | 7 % ~58s          
  |+++++                                             | 8 % ~57s          
  |+++++                                             | 9 % ~56s          
  |++++++                                            | 10% ~56s          
  |++++++                                            | 11% ~55s          
  |+++++++                                           | 12% ~54s          
  |+++++++                                           | 13% ~53s          
  |++++++++                                          | 14% ~53s          
  |++++++++                                          | 15% ~53s          
  |+++++++++                                         | 16% ~52s          
  |+++++++++                                         | 17% ~52s          
  |++++++++++                                        | 18% ~51s          
  |++++++++++                                        | 19% ~50s          
  |+++++++++++                                       | 20% ~49s          
  |+++++++++++                                       | 21% ~49s          
  |++++++++++++                                      | 22% ~48s          
  |++++++++++++                                      | 23% ~48s          
  |+++++++++++++                                     | 24% ~47s          
  |+++++++++++++                                     | 25% ~01m 48s      
  |++++++++++++++                                    | 26% ~01m 44s      
  |++++++++++++++                                    | 27% ~01m 41s      
  |+++++++++++++++                                   | 28% ~01m 37s      
  |+++++++++++++++                                   | 29% ~01m 34s      
  |++++++++++++++++                                  | 30% ~01m 31s      
  |++++++++++++++++                                  | 31% ~01m 28s      
  |+++++++++++++++++                                 | 32% ~01m 26s      
  |+++++++++++++++++                                 | 33% ~01m 23s      
  |++++++++++++++++++                                | 34% ~01m 22s      
  |++++++++++++++++++                                | 35% ~01m 19s      
  |+++++++++++++++++++                               | 36% ~01m 17s      
  |+++++++++++++++++++                               | 37% ~01m 15s      
  |++++++++++++++++++++                              | 38% ~01m 13s      
  |++++++++++++++++++++                              | 39% ~01m 10s      
  |+++++++++++++++++++++                             | 40% ~01m 08s      
  |+++++++++++++++++++++                             | 41% ~01m 06s      
  |++++++++++++++++++++++                            | 42% ~01m 05s      
  |++++++++++++++++++++++                            | 43% ~01m 03s      
  |+++++++++++++++++++++++                           | 44% ~01m 01s      
  |+++++++++++++++++++++++                           | 45% ~59s          
  |++++++++++++++++++++++++                          | 46% ~58s          
  |++++++++++++++++++++++++                          | 47% ~56s          
  |+++++++++++++++++++++++++                         | 48% ~54s          
  |+++++++++++++++++++++++++                         | 49% ~53s          
  |++++++++++++++++++++++++++                        | 51% ~51s          
  |++++++++++++++++++++++++++                        | 52% ~50s          
  |+++++++++++++++++++++++++++                       | 53% ~48s          
  |+++++++++++++++++++++++++++                       | 54% ~47s          
  |++++++++++++++++++++++++++++                      | 55% ~46s          
  |++++++++++++++++++++++++++++                      | 56% ~44s          
  |+++++++++++++++++++++++++++++                     | 57% ~43s          
  |+++++++++++++++++++++++++++++                     | 58% ~42s          
  |++++++++++++++++++++++++++++++                    | 59% ~40s          
  |++++++++++++++++++++++++++++++                    | 60% ~39s          
  |+++++++++++++++++++++++++++++++                   | 61% ~38s          
  |+++++++++++++++++++++++++++++++                   | 62% ~37s          
  |++++++++++++++++++++++++++++++++                  | 63% ~36s          
  |++++++++++++++++++++++++++++++++                  | 64% ~34s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~33s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~32s          
  |++++++++++++++++++++++++++++++++++                | 67% ~31s          
  |++++++++++++++++++++++++++++++++++                | 68% ~30s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~29s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~28s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~27s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~26s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~25s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~24s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~23s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~22s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~21s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~20s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~19s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~18s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~17s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~16s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~15s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~12s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 21s
DT::datatable(EC.markers)
EC_Volcano_TargetsA = EnhancedVolcano(EC.markers,
    lab = rownames(EC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Endothelial cell markers\n(EC communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/(nrow(EC.markers)), # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
EC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.EC.DEG.Targets.pdf"), 
       plot = EC_Volcano_TargetsA)

The target results are given below and written to a file.

library(tibble)
EC.markers <- add_column(EC.markers, Gene = row.names(EC.markers), .before = 1)

temp <- EC.markers[EC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".EC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

T-cells

Comparison between the T-cell communities (CD3/CD4/CD8+), and all other communities.


TC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD3+ TC I",
                                      "CD3+ TC II", 
                                      "CD3+ TC III", 
                                      "CD3+ TC IV", 
                                      "CD3+ TC V", 
                                      "CD3+ TC VI", 
                                      "FOXP3+ TC"), 
                          ident.2 = c("CD68+CASP1+IL1B+SELL MInf", 
                                      "CD68+CD1C+ DC", 
                                      "CD68+CD4+ Mono",
                                      "CD68+IL18+TLR4+TREM2+ MRes",
                                      "CD68+ABCA1+OLR1+TREM2+ FC",
                                      # "CD3+ TC I",
                                      # "CD3+ TC II", 
                                      # "CD3+ TC III", 
                                      # "CD3+ TC IV", 
                                      # "CD3+ TC V", 
                                      # "CD3+ TC VI", 
                                      # "FOXP3+ TC", 
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "ACTA2+ SMC", 
                                      "CD3+CD56+ NK I",
                                      "CD3+CD56+ NK II", 
                                      "CD68+KIT+ MC",
                                      "CD79+ BCplasma", 
                                      "CD79A+ BCmem"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 00s      
  |++                                                | 2 % ~54s          
  |++                                                | 3 % ~52s          
  |+++                                               | 4 % ~50s          
  |+++                                               | 5 % ~49s          
  |++++                                              | 6 % ~48s          
  |++++                                              | 7 % ~48s          
  |+++++                                             | 8 % ~02h 58m 55s  
  |+++++                                             | 9 % ~02h 37m 22s  
  |++++++                                            | 10% ~02h 20m 06s  
  |++++++                                            | 11% ~02h 05m 59s  
  |+++++++                                           | 12% ~01h 54m 13s  
  |+++++++                                           | 13% ~01h 44m 16s  
  |++++++++                                          | 14% ~01h 35m 44s  
  |++++++++                                          | 15% ~01h 28m 20s  
  |+++++++++                                         | 16% ~01h 21m 51s  
  |+++++++++                                         | 17% ~01h 16m 08s  
  |++++++++++                                        | 18% ~01h 11m 03s  
  |++++++++++                                        | 19% ~01h 06m 30s  
  |+++++++++++                                       | 20% ~01h 02m 25s  
  |+++++++++++                                       | 21% ~58m 42s      
  |++++++++++++                                      | 22% ~55m 20s      
  |++++++++++++                                      | 23% ~52m 16s      
  |+++++++++++++                                     | 24% ~49m 27s      
  |+++++++++++++                                     | 26% ~46m 51s      
  |++++++++++++++                                    | 27% ~44m 27s      
  |++++++++++++++                                    | 28% ~01h 21m 53s  
  |+++++++++++++++                                   | 29% ~01h 17m 52s  
  |+++++++++++++++                                   | 30% ~01h 14m 08s  
  |++++++++++++++++                                  | 31% ~01h 10m 38s  
  |++++++++++++++++                                  | 32% ~01h 07m 22s  
  |+++++++++++++++++                                 | 33% ~01h 04m 19s  
  |+++++++++++++++++                                 | 34% ~01h 01m 26s  
  |++++++++++++++++++                                | 35% ~58m 44s      
  |++++++++++++++++++                                | 36% ~56m 10s      
  |+++++++++++++++++++                               | 37% ~53m 45s      
  |+++++++++++++++++++                               | 38% ~51m 28s      
  |++++++++++++++++++++                              | 39% ~49m 19s      
  |++++++++++++++++++++                              | 40% ~47m 15s      
  |+++++++++++++++++++++                             | 41% ~45m 18s      
  |+++++++++++++++++++++                             | 42% ~43m 27s      
  |++++++++++++++++++++++                            | 43% ~41m 41s      
  |++++++++++++++++++++++                            | 44% ~39m 60s      
  |+++++++++++++++++++++++                           | 45% ~38m 23s      
  |+++++++++++++++++++++++                           | 46% ~36m 51s      
  |++++++++++++++++++++++++                          | 47% ~35m 22s      
  |++++++++++++++++++++++++                          | 48% ~33m 58s      
  |+++++++++++++++++++++++++                         | 49% ~32m 37s      
  |+++++++++++++++++++++++++                         | 50% ~31m 19s      
  |++++++++++++++++++++++++++                        | 51% ~30m 04s      
  |+++++++++++++++++++++++++++                       | 52% ~28m 53s      
  |+++++++++++++++++++++++++++                       | 53% ~27m 44s      
  |++++++++++++++++++++++++++++                      | 54% ~26m 37s      
  |++++++++++++++++++++++++++++                      | 55% ~25m 33s      
  |+++++++++++++++++++++++++++++                     | 56% ~24m 31s      
  |+++++++++++++++++++++++++++++                     | 57% ~23m 32s      
  |++++++++++++++++++++++++++++++                    | 58% ~22m 34s      
  |++++++++++++++++++++++++++++++                    | 59% ~21m 39s      
  |+++++++++++++++++++++++++++++++                   | 60% ~20m 45s      
  |+++++++++++++++++++++++++++++++                   | 61% ~19m 53s      
  |++++++++++++++++++++++++++++++++                  | 62% ~19m 03s      
  |++++++++++++++++++++++++++++++++                  | 63% ~18m 15s      
  |+++++++++++++++++++++++++++++++++                 | 64% ~17m 28s      
  |+++++++++++++++++++++++++++++++++                 | 65% ~16m 42s      
  |++++++++++++++++++++++++++++++++++                | 66% ~15m 58s      
  |++++++++++++++++++++++++++++++++++                | 67% ~15m 15s      
  |+++++++++++++++++++++++++++++++++++               | 68% ~14m 34s      
  |+++++++++++++++++++++++++++++++++++               | 69% ~13m 53s      
  |++++++++++++++++++++++++++++++++++++              | 70% ~13m 14s      
  |++++++++++++++++++++++++++++++++++++              | 71% ~12m 36s      
  |+++++++++++++++++++++++++++++++++++++             | 72% ~11m 59s      
  |+++++++++++++++++++++++++++++++++++++             | 73% ~11m 23s      
  |++++++++++++++++++++++++++++++++++++++            | 74% ~10m 48s      
  |++++++++++++++++++++++++++++++++++++++            | 76% ~10m 13s      
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~09m 40s      
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~09m 08s      
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~08m 36s      
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~08m 05s      
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~07m 35s      
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~07m 06s      
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~06m 38s      
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~06m 10s      
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~05m 43s      
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~05m 16s      
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04m 50s      
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~04m 25s      
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~04m 00s      
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~03m 36s      
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03m 12s      
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02m 49s      
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02m 26s      
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02m 04s      
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01m 42s      
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01m 21s      
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01m 00s      
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~40s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~20s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=31m 43s
DT::datatable(TC.markers)
TC_Volcano_TargetsA = EnhancedVolcano(TC.markers,
    lab = rownames(TC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "T-cell markers\n(T-cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/nrow(TC.markers), # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
TC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.TC.DEG.Targets.pdf"), 
       plot = TC_Volcano_TargetsA)

The target results are given below and written to a file.

library(tibble)
TC.markers <- add_column(TC.markers, Gene = row.names(TC.markers), .before = 1)

temp <- TC.markers[TC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".TC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

B-cells

Comparison between the B-cell communities (CD79A+), and all other communities.


BC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD79+ BCplasma", 
                                      "CD79A+ BCmem"), 
                          ident.2 = c("CD68+CASP1+IL1B+SELL MInf", 
                                      "CD68+CD1C+ DC", 
                                      "CD68+CD4+ Mono",
                                      "CD68+IL18+TLR4+TREM2+ MRes",
                                      "CD68+ABCA1+OLR1+TREM2+ FC",
                                      "CD3+ TC I",
                                      "CD3+ TC II", 
                                      "CD3+ TC III", 
                                      "CD3+ TC IV", 
                                      "CD3+ TC V", 
                                      "CD3+ TC VI", 
                                      "FOXP3+ TC", 
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "ACTA2+ SMC", 
                                      "CD3+CD56+ NK I",
                                      "CD3+CD56+ NK II", 
                                      "CD68+KIT+ MC"
                                      # "CD79+ BCplasma", 
                                      # "CD79A+ BCmem"
                                      ))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~43s          
  |+                                                 | 2 % ~42s          
  |++                                                | 3 % ~41s          
  |++                                                | 4 % ~41s          
  |+++                                               | 5 % ~40s          
  |+++                                               | 6 % ~40s          
  |++++                                              | 7 % ~40s          
  |++++                                              | 8 % ~39s          
  |+++++                                             | 9 % ~39s          
  |+++++                                             | 10% ~38s          
  |++++++                                            | 11% ~38s          
  |++++++                                            | 12% ~37s          
  |+++++++                                           | 13% ~37s          
  |+++++++                                           | 14% ~37s          
  |++++++++                                          | 15% ~36s          
  |++++++++                                          | 16% ~36s          
  |+++++++++                                         | 17% ~35s          
  |+++++++++                                         | 18% ~35s          
  |++++++++++                                        | 19% ~35s          
  |++++++++++                                        | 20% ~34s          
  |+++++++++++                                       | 21% ~34s          
  |+++++++++++                                       | 22% ~33s          
  |++++++++++++                                      | 23% ~33s          
  |++++++++++++                                      | 24% ~32s          
  |+++++++++++++                                     | 25% ~32s          
  |+++++++++++++                                     | 26% ~31s          
  |++++++++++++++                                    | 27% ~31s          
  |++++++++++++++                                    | 28% ~31s          
  |+++++++++++++++                                   | 29% ~30s          
  |+++++++++++++++                                   | 30% ~30s          
  |++++++++++++++++                                  | 31% ~31s          
  |++++++++++++++++                                  | 32% ~30s          
  |+++++++++++++++++                                 | 33% ~30s          
  |+++++++++++++++++                                 | 34% ~29s          
  |++++++++++++++++++                                | 35% ~29s          
  |++++++++++++++++++                                | 36% ~28s          
  |+++++++++++++++++++                               | 37% ~28s          
  |+++++++++++++++++++                               | 38% ~27s          
  |++++++++++++++++++++                              | 39% ~27s          
  |++++++++++++++++++++                              | 40% ~26s          
  |+++++++++++++++++++++                             | 41% ~26s          
  |+++++++++++++++++++++                             | 42% ~26s          
  |++++++++++++++++++++++                            | 43% ~25s          
  |++++++++++++++++++++++                            | 44% ~25s          
  |+++++++++++++++++++++++                           | 45% ~24s          
  |+++++++++++++++++++++++                           | 46% ~24s          
  |++++++++++++++++++++++++                          | 47% ~23s          
  |++++++++++++++++++++++++                          | 48% ~23s          
  |+++++++++++++++++++++++++                         | 49% ~22s          
  |+++++++++++++++++++++++++                         | 50% ~22s          
  |++++++++++++++++++++++++++                        | 51% ~21s          
  |++++++++++++++++++++++++++                        | 52% ~21s          
  |+++++++++++++++++++++++++++                       | 53% ~21s          
  |+++++++++++++++++++++++++++                       | 54% ~20s          
  |++++++++++++++++++++++++++++                      | 55% ~20s          
  |++++++++++++++++++++++++++++                      | 56% ~19s          
  |+++++++++++++++++++++++++++++                     | 57% ~19s          
  |+++++++++++++++++++++++++++++                     | 58% ~18s          
  |++++++++++++++++++++++++++++++                    | 59% ~18s          
  |++++++++++++++++++++++++++++++                    | 60% ~17s          
  |+++++++++++++++++++++++++++++++                   | 61% ~17s          
  |+++++++++++++++++++++++++++++++                   | 62% ~16s          
  |++++++++++++++++++++++++++++++++                  | 63% ~16s          
  |++++++++++++++++++++++++++++++++                  | 64% ~16s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~15s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~15s          
  |++++++++++++++++++++++++++++++++++                | 67% ~14s          
  |++++++++++++++++++++++++++++++++++                | 68% ~14s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~13s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~13s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~12s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~12s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~12s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~11s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~11s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~10s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~10s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~09s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~09s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~43s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~32s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~21s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=17m 05s
DT::datatable(BC.markers)
BC_Volcano_TargetsA = EnhancedVolcano(BC.markers,
    lab = rownames(BC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "B-cell markers\n(B-cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/nrow(BC.markers), # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
BC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.BC.DEG.Targets.pdf"), 
       plot = BC_Volcano_TargetsA)

The target results are given below and written to a file.

library(tibble)
BC.markers <- add_column(BC.markers, Gene = row.names(BC.markers), .before = 1)

temp <- BC.markers[BC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".BC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

Mast cells

Comparison between the mast cell communities (KIT+), and all other communities.


MC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD68+KIT+ MC"), 
                          ident.2 = c("CD68+CASP1+IL1B+SELL MInf", 
                                      "CD68+CD1C+ DC", 
                                      "CD68+CD4+ Mono",
                                      "CD68+IL18+TLR4+TREM2+ MRes",
                                      "CD68+ABCA1+OLR1+TREM2+ FC",
                                      "CD3+ TC I",
                                      "CD3+ TC II", 
                                      "CD3+ TC III", 
                                      "CD3+ TC IV", 
                                      "CD3+ TC V", 
                                      "CD3+ TC VI", 
                                      "FOXP3+ TC", 
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "ACTA2+ SMC", 
                                      "CD3+CD56+ NK I",
                                      "CD3+CD56+ NK II", 
                                      # "CD68+KIT+ MC",
                                      "CD79+ BCplasma", 
                                      "CD79A+ BCmem"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~60s          
  |+                                                 | 2 % ~56s          
  |++                                                | 3 % ~55s          
  |++                                                | 4 % ~55s          
  |+++                                               | 5 % ~55s          
  |+++                                               | 6 % ~55s          
  |++++                                              | 7 % ~54s          
  |++++                                              | 8 % ~54s          
  |+++++                                             | 9 % ~53s          
  |+++++                                             | 10% ~52s          
  |++++++                                            | 11% ~52s          
  |++++++                                            | 12% ~51s          
  |+++++++                                           | 13% ~51s          
  |+++++++                                           | 14% ~50s          
  |++++++++                                          | 15% ~49s          
  |++++++++                                          | 16% ~49s          
  |+++++++++                                         | 17% ~48s          
  |+++++++++                                         | 18% ~47s          
  |++++++++++                                        | 19% ~47s          
  |++++++++++                                        | 20% ~46s          
  |+++++++++++                                       | 21% ~45s          
  |+++++++++++                                       | 22% ~45s          
  |++++++++++++                                      | 23% ~44s          
  |++++++++++++                                      | 24% ~44s          
  |+++++++++++++                                     | 25% ~43s          
  |+++++++++++++                                     | 26% ~42s          
  |++++++++++++++                                    | 27% ~42s          
  |++++++++++++++                                    | 28% ~41s          
  |+++++++++++++++                                   | 29% ~42s          
  |+++++++++++++++                                   | 30% ~41s          
  |++++++++++++++++                                  | 31% ~41s          
  |++++++++++++++++                                  | 32% ~40s          
  |+++++++++++++++++                                 | 33% ~40s          
  |+++++++++++++++++                                 | 34% ~39s          
  |++++++++++++++++++                                | 35% ~38s          
  |++++++++++++++++++                                | 36% ~38s          
  |+++++++++++++++++++                               | 37% ~37s          
  |+++++++++++++++++++                               | 38% ~37s          
  |++++++++++++++++++++                              | 39% ~36s          
  |++++++++++++++++++++                              | 40% ~35s          
  |+++++++++++++++++++++                             | 41% ~35s          
  |+++++++++++++++++++++                             | 42% ~34s          
  |++++++++++++++++++++++                            | 43% ~33s          
  |++++++++++++++++++++++                            | 44% ~33s          
  |+++++++++++++++++++++++                           | 45% ~32s          
  |+++++++++++++++++++++++                           | 46% ~31s          
  |++++++++++++++++++++++++                          | 47% ~31s          
  |++++++++++++++++++++++++                          | 48% ~30s          
  |+++++++++++++++++++++++++                         | 49% ~17m 02s      
  |+++++++++++++++++++++++++                         | 50% ~16m 23s      
  |++++++++++++++++++++++++++                        | 51% ~15m 45s      
  |++++++++++++++++++++++++++                        | 52% ~15m 08s      
  |+++++++++++++++++++++++++++                       | 53% ~14m 33s      
  |+++++++++++++++++++++++++++                       | 54% ~13m 59s      
  |++++++++++++++++++++++++++++                      | 55% ~13m 26s      
  |++++++++++++++++++++++++++++                      | 56% ~12m 55s      
  |+++++++++++++++++++++++++++++                     | 57% ~12m 24s      
  |+++++++++++++++++++++++++++++                     | 58% ~24m 50s      
  |++++++++++++++++++++++++++++++                    | 59% ~23m 50s      
  |++++++++++++++++++++++++++++++                    | 60% ~22m 52s      
  |+++++++++++++++++++++++++++++++                   | 61% ~21m 56s      
  |+++++++++++++++++++++++++++++++                   | 62% ~21m 02s      
  |++++++++++++++++++++++++++++++++                  | 63% ~20m 10s      
  |++++++++++++++++++++++++++++++++                  | 64% ~19m 19s      
  |+++++++++++++++++++++++++++++++++                 | 65% ~18m 30s      
  |+++++++++++++++++++++++++++++++++                 | 66% ~25m 56s      
  |++++++++++++++++++++++++++++++++++                | 67% ~24m 48s      
  |++++++++++++++++++++++++++++++++++                | 68% ~23m 42s      
  |+++++++++++++++++++++++++++++++++++               | 69% ~22m 38s      
  |+++++++++++++++++++++++++++++++++++               | 70% ~21m 36s      
  |++++++++++++++++++++++++++++++++++++              | 71% ~20m 35s      
  |++++++++++++++++++++++++++++++++++++              | 72% ~19m 36s      
  |+++++++++++++++++++++++++++++++++++++             | 73% ~18m 39s      
  |+++++++++++++++++++++++++++++++++++++             | 74% ~17m 43s      
  |++++++++++++++++++++++++++++++++++++++            | 75% ~21m 50s      
  |++++++++++++++++++++++++++++++++++++++            | 76% ~20m 41s      
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~19m 34s      
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~18m 29s      
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~17m 25s      
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~16m 23s      
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~15m 22s      
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~15m 14s      
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~14m 13s      
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~13m 13s      
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~12m 15s      
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~11m 18s      
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~10m 23s      
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~09m 28s      
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~08m 35s      
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~07m 43s      
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~06m 52s      
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06m 03s      
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05m 14s      
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~04m 26s      
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03m 40s      
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02m 54s      
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02m 09s      
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01m 25s      
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~42s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01h 09m 33s
DT::datatable(MC.markers)
MC_Volcano_TargetsA = EnhancedVolcano(MC.markers,
    lab = rownames(MC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Mast cell markers\n(Mast cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/nrow(MC.markers), # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
MC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.MC.DEG.Targets.pdf"), 
       plot = MC_Volcano_TargetsA)

The target results are given below and written to a file.

library(tibble)
MC.markers <- add_column(MC.markers, Gene = row.names(MC.markers), .before = 1)

temp <- MC.markers[MC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".MC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

NK-cells

Comparison between the natural killer cell communities (NCAM1+), and all other communities.


NK.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD3+CD56+ NK I",
                                      "CD3+CD56+ NK II"), 
                          ident.2 = c("CD68+CASP1+IL1B+SELL MInf", 
                                      "CD68+CD1C+ DC", 
                                      "CD68+CD4+ Mono",
                                      "CD68+IL18+TLR4+TREM2+ MRes",
                                      "CD68+ABCA1+OLR1+TREM2+ FC",
                                      "CD3+ TC I",
                                      "CD3+ TC II", 
                                      "CD3+ TC III", 
                                      "CD3+ TC IV", 
                                      "CD3+ TC V", 
                                      "CD3+ TC VI", 
                                      "FOXP3+ TC", 
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "ACTA2+ SMC", 
                                      # "CD3+CD56+ NK I",
                                      # "CD3+CD56+ NK II", 
                                      "CD68+KIT+ MC",
                                      "CD79+ BCplasma", 
                                      "CD79A+ BCmem"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~36s          
  |++                                                | 2 % ~30s          
  |++                                                | 3 % ~28s          
  |+++                                               | 4 % ~27s          
  |+++                                               | 5 % ~26s          
  |++++                                              | 6 % ~26s          
  |++++                                              | 7 % ~25s          
  |+++++                                             | 8 % ~25s          
  |+++++                                             | 9 % ~24s          
  |++++++                                            | 10% ~24s          
  |++++++                                            | 11% ~23s          
  |+++++++                                           | 12% ~23s          
  |+++++++                                           | 13% ~23s          
  |++++++++                                          | 14% ~22s          
  |++++++++                                          | 15% ~22s          
  |+++++++++                                         | 16% ~22s          
  |+++++++++                                         | 18% ~21s          
  |++++++++++                                        | 19% ~21s          
  |++++++++++                                        | 20% ~24s          
  |+++++++++++                                       | 21% ~24s          
  |+++++++++++                                       | 22% ~23s          
  |++++++++++++                                      | 23% ~23s          
  |++++++++++++                                      | 24% ~23s          
  |+++++++++++++                                     | 25% ~22s          
  |+++++++++++++                                     | 26% ~22s          
  |++++++++++++++                                    | 27% ~21s          
  |++++++++++++++                                    | 28% ~21s          
  |+++++++++++++++                                   | 29% ~20s          
  |+++++++++++++++                                   | 30% ~20s          
  |++++++++++++++++                                  | 31% ~20s          
  |++++++++++++++++                                  | 32% ~19s          
  |+++++++++++++++++                                 | 33% ~19s          
  |++++++++++++++++++                                | 34% ~19s          
  |++++++++++++++++++                                | 35% ~18s          
  |+++++++++++++++++++                               | 36% ~18s          
  |+++++++++++++++++++                               | 37% ~18s          
  |++++++++++++++++++++                              | 38% ~17s          
  |++++++++++++++++++++                              | 39% ~17s          
  |+++++++++++++++++++++                             | 40% ~17s          
  |+++++++++++++++++++++                             | 41% ~16s          
  |++++++++++++++++++++++                            | 42% ~16s          
  |++++++++++++++++++++++                            | 43% ~16s          
  |+++++++++++++++++++++++                           | 44% ~15s          
  |+++++++++++++++++++++++                           | 45% ~15s          
  |++++++++++++++++++++++++                          | 46% ~15s          
  |++++++++++++++++++++++++                          | 47% ~14s          
  |+++++++++++++++++++++++++                         | 48% ~14s          
  |+++++++++++++++++++++++++                         | 49% ~14s          
  |++++++++++++++++++++++++++                        | 51% ~14s          
  |++++++++++++++++++++++++++                        | 52% ~13s          
  |+++++++++++++++++++++++++++                       | 53% ~13s          
  |+++++++++++++++++++++++++++                       | 54% ~13s          
  |++++++++++++++++++++++++++++                      | 55% ~12s          
  |++++++++++++++++++++++++++++                      | 56% ~12s          
  |+++++++++++++++++++++++++++++                     | 57% ~12s          
  |+++++++++++++++++++++++++++++                     | 58% ~11s          
  |++++++++++++++++++++++++++++++                    | 59% ~11s          
  |++++++++++++++++++++++++++++++                    | 60% ~11s          
  |+++++++++++++++++++++++++++++++                   | 61% ~11s          
  |+++++++++++++++++++++++++++++++                   | 62% ~10s          
  |++++++++++++++++++++++++++++++++                  | 63% ~10s          
  |++++++++++++++++++++++++++++++++                  | 64% ~10s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~09s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~09s          
  |++++++++++++++++++++++++++++++++++                | 67% ~09s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~09s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~08s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~08s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~08s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~07s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~07s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~07s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~06s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=26s  
DT::datatable(NK.markers)
NK_Volcano_TargetsA = EnhancedVolcano(NK.markers,
    lab = rownames(NK.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "NK markers\n(NK-cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/nrow(NK.markers), # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
NK_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.NK.DEG.Targets.pdf"), 
       plot = NK_Volcano_TargetsA)

The target results are given below and written to a file.

library(tibble)
NK.markers <- add_column(NK.markers, Gene = row.names(NK.markers), .before = 1)

temp <- NK.markers[NK.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".NK.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

Subset scRNAseq data

List of samples to be included based on informed consent (see above).

samples_of_interest <- unlist(scRNAseqDataMetaAE.all$Patient)
scRNAseqDataCEA39 <- subset(scRNAseqData, subset = Patient %in% samples_of_interest)
variables_of_interest <- c("Hospital", "ORyear", "Artery_summary",
                           "Age", "Gender",
                           "TC_final", "LDL_final", "HDL_final", "TG_final",
                           "systolic", "diastoli", "GFR_MDRD", "BMI",
                           "KDOQI", "BMI_WHO",
                           "SmokerStatus", "AlcoholUse",
                           "DiabetesStatus",
                           "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs",
                           "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD",
                           "Stroke_Dx",
                           "sympt", "Symptoms.5G", "AsymptSympt", "AsymptSympt2G",
                           "Symptoms.Update2G", "Symptoms.Update3G", "indexsymptoms_latest_4g",
                           "restenos", "stenose",
                           "CAD_history", "PAOD", "Peripheral.interv",
                           "EP_composite", "EP_composite_time", "EP_major", "EP_major_time")

temp <- subset(scRNAseqDataMetaAE.all, select = c("Patient", variables_of_interest))
# str(temp)
scRNAseqDataCEA39@meta.data <- merge(scRNAseqDataCEA39@meta.data, temp, by.x = "Patient", by.y = "Patient")
scRNAseqDataCEA39@meta.data <- dplyr::rename(scRNAseqDataCEA39@meta.data, "STUDY_NUMBER" = "Patient")

# str(scRNAseqDataCEA39@meta.data)

Saving new dataset

temp2 <- as_tibble(subset(scRNAseqDataCEA39@meta.data, select = c("STUDY_NUMBER", "orig.ident", "nCount_RNA", "nFeature_RNA",
                                                                 "Plate", "Batch", "C.H", "Type", "percent.mt",
                                                                 "nCount_SCT", "nFeature_SCT", "seurat_clusters")))

# fwrite(temp2,
#        file = paste0(OUT_loc, "/", Today, ".AESCRNA.CEA.39pts.samplelist.after_qc.IC_commercial.csv"),
#        sep = ",", row.names = FALSE, col.names = TRUE,
#        showProgress = TRUE)
# rm(temp2)
# 
# temp <- dplyr::rename(temp, "STUDY_NUMBER" = "Patient")
# fwrite(temp,
#        file = paste0(OUT_loc, "/", Today, ".AESCRNA.CEA.39pts.clinicaldata.after_qc.IC_commercial.csv"),
#        sep = ",", row.names = FALSE, col.names = TRUE,
#        showProgress = TRUE)
# rm(temp)
# 
# saveRDS(scRNAseqDataCEA39, file = paste0(OUT_loc, "/", Today, ".AESCRNA.CEA.39pts.Seurat.after_qc.IC_commercial.RDS"))

fwrite(temp2,
       file = paste0(OUT_loc, "/", Today, ".AESCRNA.CEA.39pts.samplelist.after_qc.IC_academic.csv"),
       sep = ",", row.names = FALSE, col.names = TRUE,
       showProgress = TRUE)
rm(temp2)

temp <- dplyr::rename(temp, "STUDY_NUMBER" = "Patient")
fwrite(temp,
       file = paste0(OUT_loc, "/", Today, ".AESCRNA.CEA.39pts.clinicaldata.after_qc.IC_academic.csv"),
       sep = ",", row.names = FALSE, col.names = TRUE,
       showProgress = TRUE)
rm(temp)

saveRDS(scRNAseqDataCEA39, file = paste0(OUT_loc, "/", Today, ".AESCRNA.CEA.39pts.Seurat.after_qc.IC_academic.RDS"))

Session information


Version:      v1.1.1
Last update:  2023-06-14
Written by:   Sander W. van der Laan (s.w.vanderlaan-2[at]umcutrecht.nl).
Description:  Script to load single-cell RNA sequencing (scRNAseq) data, and perform quality control (QC), and initial mapping to cells.
Minimum requirements: R version 3.5.2 (2018-12-20) -- 'Eggshell Igloo', macOS Mojave (10.14.2).

**MoSCoW To-Do List**
The things we Must, Should, Could, and Would have given the time we have.
_M_

_S_

_C_

_W_

**Changes log**
* v1.1.1 Fix writing baseline table.
* v1.1.0 Update to study database.
* v1.0.2 Fixes to the start of the notebook. Update to loading of the clinical data. Fix on the gene-filtering.
* v1.0.1 Update to main AEDB (there is an error in the Age-variable in the new version). Fewer patients in scRNAseq (32 vs 39 with the newer dataset).
* v1.0.0 Initial version.

sessionInfo()
R version 4.3.0 (2023-04-21)
Platform: x86_64-apple-darwin22.4.0 (64-bit)
Running under: macOS 14.0

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib 
LAPACK: /usr/local/Cellar/r/4.3.0_1/lib/R/lib/libRlapack.dylib;  LAPACK version 3.11.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: Europe/Amsterdam
tzcode source: internal

attached base packages:
 [1] stats4    grid      tools     stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] RColorBrewer_1.1-3                      SeuratObject_4.1.3                      Seurat_4.3.0                           
 [4] BiocManager_1.30.20                     sjlabelled_1.2.0                        mia_1.8.0                              
 [7] MultiAssayExperiment_1.26.0             TreeSummarizedExperiment_2.8.0          Biostrings_2.68.1                      
[10] XVector_0.40.0                          SingleCellExperiment_1.22.0             MASS_7.3-60                            
[13] magrittr_2.0.3                          annotables_0.2.0                        EnhancedVolcano_1.18.0                 
[16] ggrepel_0.9.3                           AnnotationFilter_1.24.0                 TxDb.Hsapiens.UCSC.hg19.knownGene_3.2.2
[19] mygene_1.36.0                           org.Hs.eg.db_3.17.0                     DESeq2_1.40.1                          
[22] SummarizedExperiment_1.30.1             MatrixGenerics_1.12.0                   matrixStats_1.0.0                      
[25] GenomicFeatures_1.52.0                  AnnotationDbi_1.62.1                    Biobase_2.60.0                         
[28] GenomicRanges_1.52.0                    GenomeInfoDb_1.36.0                     IRanges_2.34.0                         
[31] S4Vectors_0.38.1                        BiocGenerics_0.46.0                     Hmisc_5.1-0                            
[34] survminer_0.4.9                         survival_3.5-5                          GGally_2.1.2                           
[37] PerformanceAnalytics_2.0.4              xts_0.13.1                              zoo_1.8-12                             
[40] ggcorrplot_0.1.4.999                    corrr_0.4.4                             reshape2_1.4.4                         
[43] bacon_1.28.0                            ellipse_0.4.5                           BiocParallel_1.34.2                    
[46] meta_6.2-1                              qqman_0.1.8                             tidylog_1.0.2                          
[49] gridExtra_2.3                           plyr_1.8.8                              rmarkdown_2.22                         
[52] patchwork_1.1.2.9000                    labelled_2.11.0                         sjPlot_2.8.14                          
[55] UpSetR_1.4.0                            ggpubr_0.6.0                            forestplot_3.1.1                       
[58] abind_1.4-5                             checkmate_2.2.0                         pheatmap_1.0.12                        
[61] devtools_2.4.5                          usethis_2.2.0                           BlandAltmanLeh_0.3.1                   
[64] tableone_0.13.2                         openxlsx_4.2.5.2                        haven_2.5.2                            
[67] eeptools_1.2.5                          DT_0.28                                 knitr_1.43                             
[70] lubridate_1.9.2                         forcats_1.0.0                           stringr_1.5.0                          
[73] purrr_1.0.1                             tibble_3.2.1                            ggplot2_3.4.2                          
[76] tidyverse_2.0.0                         data.table_1.14.8                       naniar_1.0.0                           
[79] tidyr_1.3.0                             dplyr_1.1.2                             optparse_1.7.3                         
[82] readr_2.1.4                             pander_0.6.5                            R.utils_2.12.2                         
[85] R.oo_1.25.0                             R.methodsS3_1.8.2                       worcs_0.1.10                           
[88] credentials_1.3.2                      

loaded via a namespace (and not attached):
  [1] igraph_1.4.3                ica_1.0-3                   plotly_4.10.2               Formula_1.2-5              
  [5] scater_1.28.0               zlibbioc_1.46.0             gert_1.9.2                  tidyselect_1.2.0           
  [9] bit_4.0.5                   lattice_0.21-8              rjson_0.2.21                blob_1.2.4                 
 [13] urlchecker_1.0.1            S4Arrays_1.0.4              parallel_4.3.0              png_0.1-8                  
 [17] tinytex_0.45                cli_3.6.1                   bayestestR_0.13.1           ProtGenerics_1.32.0        
 [21] askpass_1.1                 sjstats_0.18.2              openssl_2.0.6               goftest_1.2-3              
 [25] textshaping_0.3.6           BiocIO_1.10.0               BiocNeighbors_1.18.0        uwot_0.1.14                
 [29] curl_5.0.0                  tidytree_0.4.2              mime_0.12                   evaluate_0.21              
 [33] gsubfn_0.7                  leiden_0.4.3                stringi_1.7.12              backports_1.4.1            
 [37] XML_3.99-0.14               httpuv_1.6.11               rappdirs_0.3.3              splines_4.3.0              
 [41] getopt_1.20.3               KMsurv_0.1-5                ggbeeswarm_0.7.2            sctransform_0.3.5          
 [45] sessioninfo_1.2.2           DBI_1.1.3                   jquerylib_0.1.4             withr_2.5.0                
 [49] systemfonts_1.0.4           class_7.3-22                lmtest_0.9-40               rtracklayer_1.60.0         
 [53] htmlwidgets_1.6.2           fs_1.6.2                    biomaRt_2.56.0              labeling_0.4.2             
 [57] gh_1.4.0                    ranger_0.15.1               reticulate_1.29             decontam_1.20.0            
 [61] timechange_0.2.0            fansi_1.0.4                 calibrate_1.7.7             vegan_2.6-4                
 [65] irlba_2.3.5.1               ggrastr_1.0.2               commonmark_1.9.0            ellipsis_0.3.2             
 [69] lazyeval_0.2.2              yaml_2.3.7                  scattermore_1.1             crayon_1.5.2               
 [73] RcppAnnoy_0.0.20            progressr_0.13.0            later_1.3.1                 ggridges_0.5.4             
 [77] codetools_0.2-19            base64enc_0.1-3             profvis_0.3.8               KEGGREST_1.40.0            
 [81] Rtsne_0.16                  limma_3.56.2                estimability_1.4.1          Rsamtools_2.16.0           
 [85] filelock_1.0.2              rticles_0.25                sqldf_0.4-11                foreign_0.8-84             
 [89] pkgconfig_2.0.3             xml2_1.3.4                  mathjaxr_1.6-0              GenomicAlignments_1.36.0   
 [93] ape_5.7-1                   spatstat.sparse_3.0-1       viridisLite_0.4.2           performance_0.10.4         
 [97] xtable_1.8-4                car_3.1-2                   httr_1.4.6                  globals_0.16.2             
[101] sys_3.4.2                   pkgbuild_1.4.0              beeswarm_0.4.0              htmlTable_2.4.1            
[105] broom_1.0.4                 nlme_3.1-162                dbplyr_2.3.2                survMisc_0.5.6             
[109] crosstalk_1.2.0             ggeffects_1.2.2             lme4_1.1-33                 digest_0.6.31              
[113] permute_0.9-7               numDeriv_2016.8-1.1         Matrix_1.5-4.1              farver_2.1.1               
[117] tzdb_0.4.0                  viridis_0.6.3               yulab.utils_0.0.6           DirichletMultinomial_1.42.0
[121] rpart_4.1.19                glue_1.6.2                  cachem_1.0.8                BiocFileCache_2.8.0        
[125] polyclip_1.10-4             generics_0.1.3              visdat_0.6.0                CompQuadForm_1.4.3         
[129] mvtnorm_1.2-1               proto_1.0.0                 survey_4.2-1                parallelly_1.36.0          
[133] ggtext_0.1.2                pkgload_1.3.2               arm_1.13-1                  ragg_1.2.5                 
[137] ScaledMatrix_1.8.1          carData_3.0-5               minqa_1.2.5                 pbapply_1.7-0              
[141] vroom_1.6.3                 utf8_1.2.3                  mitools_2.4                 sjmisc_2.8.9               
[145] ggsignif_0.6.4              shiny_1.7.4                 GenomeInfoDbData_1.2.10     clisymbols_1.2.0           
[149] RCurl_1.98-1.12             memoise_2.0.1               scales_1.2.1                future_1.32.0              
[153] reshape_0.8.9               RANN_2.6.1                  renv_0.17.3                 km.ci_0.5-6                
[157] spatstat.data_3.0-1         rstudioapi_0.14             cluster_2.1.4               spatstat.utils_3.0-3       
[161] hms_1.1.3                   fitdistrplus_1.1-11         munsell_0.5.0               cowplot_1.1.1              
[165] colorspace_2.1-0            rlang_1.1.1                 quadprog_1.5-8              sparseMatrixStats_1.12.0   
[169] DelayedMatrixStats_1.22.0   scuttle_1.10.1              mgcv_1.8-42                 xfun_0.39                  
[173] prereg_0.6.0                coda_0.19-4                 e1071_1.7-13                TH.data_1.1-2              
[177] metafor_4.2-0               modelr_0.1.11               remotes_2.4.2               emmeans_1.8.6              
[181] treeio_1.24.1               ggsci_3.0.0                 DECIPHER_2.28.0             bitops_1.0-7               
[185] ps_1.7.5                    promises_1.2.0.1            RSQLite_2.3.1               sandwich_3.0-2             
[189] DelayedArray_0.26.3         proxy_0.4-27                compiler_4.3.0              prettyunits_1.1.1          
[193] beachmat_2.16.0             boot_1.3-28.1               metadat_1.2-0               listenv_0.9.0              
[197] Rcpp_1.0.10                 BiocSingular_1.16.0         tensor_1.5                  progress_1.2.2             
[201] gridtext_0.1.5              insight_0.19.2              spatstat.random_3.1-5       R6_2.5.1                   
[205] fastmap_1.1.1               multcomp_1.4-23             rstatix_0.7.2               vipor_0.4.5                
[209] ROCR_1.0-11                 rsvd_1.0.5                  vcd_1.4-11                  nnet_7.3-19                
[213] gtable_0.3.3                KernSmooth_2.23-21          miniUI_0.1.1.1              deldir_1.0-9               
[217] htmltools_0.5.5             bit64_4.0.5                 spatstat.explore_3.2-1      lifecycle_1.0.3            
[221] zip_2.3.0                   processx_3.8.1              nloptr_2.0.3                callr_3.7.3                
[225] restfulr_0.0.15             sass_0.4.6                  vctrs_0.6.2                 spatstat.geom_3.2-1        
[229] sp_1.6-1                    future.apply_1.11.0         bslib_0.4.2                 pillar_1.9.0               
[233] locfit_1.5-9.7              jsonlite_1.8.5              markdown_1.7                chron_2.3-61               

Saving environment

rm(backup.scRNAseqData)
rm(scRNAseqData, scRNAseqDataCEA39)

save.image(paste0(PROJECT_loc, "/",Today,".",PROJECTNAME,".AESCRNA.results.RData"))
© 1979-2023 Sander W. van der Laan | s.w.vanderlaan[at]gmail.com | vanderlaan.science. |
LS0tCnRpdGxlOiAiTWFwcGluZyB0YXJnZXRzIHRvIHNpbmdsZSBjZWxscyBpbiBwbGFxdWVzLiIKYXV0aG9yOiAiW1NhbmRlciBXLiB2YW4gZGVyIExhYW4sIFBoRF0oaHR0cHM6Ly92YW5kZXJsYWFuLnNjaWVuY2UpIHwgcy53LnZhbmRlcmxhYW5AZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY2FjaGU6IHllcwogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2xsYXBzZTogeWVzCiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZy5hbGlnbjogY2VudGVyCiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBmaWdfaGVpZ2h0OiA2CiAgICBmaWdfcmV0aW5hOiAyCiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHRoZW1lOiBsdW1lbgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBubwogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMKbWFpbmZvbnQ6IEFyaWFsCnN1YnRpdGxlOiBBY2NvbXBhbnlpbmcgJ0FFX1RFTVBMQVRFJwplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCmJpYmxpb2dyYXBoeTogcmVmZXJlbmNlcy5iaWIKa25pdDogd29yY3M6OmNpdGVfYWxsCi0tLQoKIyBHZW5lcmFsIFNldHVwCmBgYHtyIGVjaG8gPSBGQUxTRX0Kcm0obGlzdCA9IGxzKCkpCmBgYAoKYGBge3IgTG9jYWxTeXN0ZW0sIGVjaG8gPSBGQUxTRX0Kc291cmNlKCJzY3JpcHRzL2xvY2FsLnN5c3RlbS5SIikKYGBgCgpgYGB7ciBTb3VyY2UgZnVuY3Rpb25zfQpzb3VyY2UoInNjcmlwdHMvZnVuY3Rpb25zLlIiKQpgYGAKCmBgYHtyIGxvYWRpbmdfcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnNvdXJjZSgic2NyaXB0cy9wYWNrMDMucGFja2FnZXMuUiIpCgpgYGAKCmBgYHtyIFNldHRpbmc6IENvbG9yc30KClRvZGF5ID0gZm9ybWF0KGFzLkRhdGUoYXMuUE9TSVhsdChTeXMudGltZSgpKSksICIlWSVtJWQiKQpUb2RheS5SZXBvcnQgPSBmb3JtYXQoYXMuRGF0ZShhcy5QT1NJWGx0KFN5cy50aW1lKCkpKSwgIiVBLCAlQiAlZCwgJVkiKQoKc291cmNlKCJzY3JpcHRzL2NvbG9ycy5SIikKCmBgYAoKYGBge3Igc2V0dXBfbm90ZWJvb2ssIGluY2x1ZGU9RkFMU0V9CiMgV2UgcmVjb21tZW5kIHRoYXQgeW91IHByZXBhcmUgeW91ciByYXcgZGF0YSBmb3IgYW5hbHlzaXMgaW4gJ3ByZXBhcmVfZGF0YS5SJywKIyBhbmQgZW5kIHRoYXQgZmlsZSB3aXRoIGVpdGhlciBvcGVuX2RhdGEoeW91cmRhdGEpLCBvciBjbG9zZWRfZGF0YSh5b3VyZGF0YSkuCiMgVGhlbiwgdW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIGxvYWQgdGhlIG9yaWdpbmFsIG9yIHN5bnRoZXRpYyBkYXRhCiMgKHdoaWNoZXZlciBpcyBhdmFpbGFibGUpLCB0byBhbGxvdyBhbnlvbmUgdG8gcmVwcm9kdWNlIHlvdXIgY29kZToKIyBsb2FkX2RhdGEoKQoKIyBmdXJ0aGVyIGRlZmluZSBzb21lIGtuaXRyLW9wdGlvbnMuCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDgsIGZpZy5wYXRoID0gJ0ZpZ3VyZXMvJywgCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gVFJVRSwgIyBzaG93IHdhcm5pbmdzIGR1cmluZyBjb2RlYm9vayBnZW5lcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gVFJVRSwgIyBzaG93IG1lc3NhZ2VzIGR1cmluZyBjb2RlYm9vayBnZW5lcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IFRSVUUsICMgZG8gbm90IGludGVycnVwdCBjb2RlYm9vayBnZW5lcmF0aW9uIGluIGNhc2Ugb2YgZXJyb3JzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1c3VhbGx5IGJldHRlciBmb3IgZGVidWdnaW5nCiAgICAgICAgICAgICAgICAgICAgICBlY2hvID0gVFJVRSwgICMgc2hvdyBSIGNvZGUKICAgICAgICAgICAgICAgICAgICAgIGV2YWwgPSBUUlVFKQoKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX21pbmltYWwoKSkKIyBwYW5kZXI6OnBhbmRlck9wdGlvbnMoInRhYmxlLnNwbGl0LnRhYmxlIiwgSW5mKQpsaWJyYXJ5KCJ3b3JjcyIpCmxpYnJhcnkoInJtYXJrZG93biIpCgpgYGAKCiMgRVJBLUNWRCAnZHJ1Z2dhYmxlLU1JLXRhcmdldHMnCgo8IS0tICFbRVJBLUNWRCBsb2dvXSgiVXNlcnMvc3d2YW5kZXJsYWFuL2lDbG91ZC9HZW5vbWljcy9Qcm9qZWN0cy8jRHJ1Z2dhYmxlLU1JLUdlbmVzL0FkbWluaXN0cmF0aW9uL0VSQS1DVkRcIExvZ29fQ01ZSy5qcGciKSAtLT4KCkZvciB0aGUgRVJBLUNWRCAnZHJ1Z2dhYmxlLU1JLXRhcmdldHMnIHByb2plY3QgKGdyYW50bnVtYmVyOiAwMUtMMTgwMikgd2UgcGVyZm9ybWVkIHR3byByZWxhdGVkIFJOQSBzZXF1ZW5jaW5nIChSTkFzZXEpIGV4cGVyaW1lbnRzOgoKMSkgIGNvbnZlbnRpb25hbCAoJ2J1bGsnKSBSTkFzZXEgdXNpbmcgUk5BIGV4dHJhY3RlZCBmcm9tIGNhcm90aWQgcGxhcXVlIHNhbXBsZXMsIG4gwrEgNzAwLiBBcyBvZiBgciBUb2RheS5SZXBvcnRgIGFsbCBzYW1wbGVzIGhhdmUgYmVlbiBzZWxlY3RlZCBhbmQKUk5BIGhhcyBiZWVuIGV4dHJhY3RlZDsgcXVhbGl0eSBjb250cm9sIChRQykgd2FzIHBlcmZvcm1lZCBhbmQgd2UgaGF2ZSBhIGRhdGFzZXQgb2YgNjM1IHNhbXBsZXMuCgoyKSAgc2luZ2xlLWNlbGwgUk5Bc2VxIChzY1JOQXNlcSkgb2YgYXQgbGVhc3QgbiA9IDQwIHNhbXBsZXMgKDIwIGZlbWFsZXMsIDIwIG1hbGVzKS4gQXMgb2YgYHIgVG9kYXkuUmVwb3J0YCBkYXRhIGlzIGF2YWlsYWJsZSBvZiA0MCBzYW1wbGVzICgzIGZlbWFsZXMsIDE1IG1hbGVzKSwgd2UgYXJlIGV4dGVuZGluZyBzYW1wbGluZyB0byBnZXQgbW9yZSBmZW1hbGUgc2FtcGxlcy4KClBsYXF1ZSBzYW1wbGVzIGFyZSBkZXJpdmVkIGZyb20gY2Fyb3RpZCBlbmRhcnRlcmVjdG9taWVzIGFzIHBhcnQgb2YgdGhlIFtBdGhlcm8tRXhwcmVzcyBCaW9iYW5rIFN0dWR5XShodHRwOnd3dy9hdGhlcm9leHByZXNzLm5sKSB3aGljaCBpcyBhbiBvbmdvaW5nIHN0dWR5IGluIHRoZSBVTUMgVXRyZWNodC4KCiMgQmFja2dyb3VuZAoKSGVyZSB3ZSBtYXAgdGhlIGByIFRSQUlUX09GX0lOVEVSRVNUYCB0byBzaW5nbGUtY2VsbHMgZnJvbSB0aGUgcGxhcXVlcy4KCiMjIFRhcmdldHMKCkhlcmUgd2Ugb2J0YWluIGRhdGEgZnJvbSB0aGUgYHIgVFJBSVRfT0ZfSU5URVJFU1RgIGluIHBsYXF1ZXMuCgpgYGB7ciB0YXJnZXRzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KG9wZW54bHN4KQoKZ2VuZV9saXN0X2RmIDwtIHJlYWQueGxzeChwYXN0ZTAoUFJPSkVDVF9sb2MsICIvdGFyZ2V0cy90YXJnZXRzLnhsc3giKSwgc2hlZXQgPSAiR2VuZXMiKQoKZ2VuZV9saXN0IDwtIHVubGlzdChnZW5lX2xpc3RfZGYkR2VuZSkKZ2VuZV9saXN0CgpgYGAKCgojIExvYWQgZGF0YQoKRmlyc3Qgd2Ugd2lsbCBsb2FkIHRoZSBkYXRhOgoKLSAgIHNjUk5Bc2VxIGV4cGVyaW1lbnRhbCBkYXRhIGFuZCByZW5hbWUgdGhlIGNlbGwgdHlwZXMuCi0gICBBdGhlcm8tRXhwcmVzcyBjbGluaWNhbCBkYXRhLgoKSGVyZSB3ZSBsb2FkIHRoZSBsYXRlc3QgZGF0YXNldCBmcm9tIG91ciBBdGhlcm8tRXhwcmVzcyBzaW5nbGUtY2VsbCBSTkEgZXhwZXJpbWVudC4KCmBgYHtyIExvYWREYXRhfQoKIyBsb2FkKHBhc3RlMChBRVNDUk5BX2xvYywgIi8yMDIxMDgxMS40Ni5wYXRpZW50cy5LUC5SRGF0YSIpKQojIHNjUk5Bc2VxRGF0YSA8LSBzZXVzZXQKIyBybShzZXVzZXQpCiMgCiMgc2F2ZVJEUyhzY1JOQXNlcURhdGEsIHBhc3RlMChBRVNDUk5BX2xvYywgIi8yMDIxMDgxMS40Ni5wYXRpZW50cy5LUC5SRFMiKSkKCnNjUk5Bc2VxRGF0YSA8LSByZWFkUkRTKHBhc3RlMChBRVNDUk5BX2xvYywgIi8yMDIxMDgxMS40Ni5wYXRpZW50cy5LUC5SRFMiKSkKCnNjUk5Bc2VxRGF0YQoKYGBgCgpUaGUgbmFtaW5nL2NsYXNzaWZpY2F0aW9uIGlzIGJhc2VkIG9uIGEgY29tYmluYXRpb24gY29udmVudGlvbmFsIG1hcmtlcnMuIFdlIGRvIG5vdCBjbGFpbSB0byBrbm93IHRoZSBleGFjdCBpZGVudGl0eSBvZiBlYWNoIGNlbGwsIHJhdGhlciB3ZSByZWZlciB0byBjZWxscyBhcyAnS0lUKyBNYXN0IGNlbGxzIi1saWtlIGNlbGxzLiBMaWtld2lzZSB3ZSByZWZlciB0byB0aGUgY2VsbCBjbHVzdGVycyBhcyAnY29tbXVuaXRpZXMnIG9mIGNlbGxzIHRoYXQgZXhoaWJpdCBzaW1pbGFyIHByb3BlcnRpZXMsICppLmUuKiBzaW1pbGFyIGRlZmluaW5nIG1hcmtlcnMgKCplLmcuIEtJVCopLgoKV2Ugd2lsbCByZW5hbWUgdGhlIGNlbGwgdHlwZXMgdG8gaHVtYW4gcmVhZGFibGUgbmFtZXMuCgpgYGB7ciBDaGFuZ2UgY2VsbCBjdW1tdW5pdHkgbmFtZXN9CiMjIyBjaGFuZ2UgbmFtZXMgZm9yIGNsYXJpdHkKYmFja3VwLnNjUk5Bc2VxRGF0YSA9IHNjUk5Bc2VxRGF0YQojIGdldCB0aGUgb2xkIG5hbWVzIHRvIGNoYW5nZSB0byBuZXcgbmFtZXMKVU1BUFBsb3Qoc2NSTkFzZXFEYXRhLCBsYWJlbCA9IEZBTFNFLCBwdC5zaXplID0gMS4yNSwgbGFiZWwuc2l6ZSA9IDQsIGdyb3VwLmJ5ID0gImlkZW50IikKCmBgYAoKYGBge3J9CnVuaXF1ZShzY1JOQXNlcURhdGFAYWN0aXZlLmlkZW50KQpgYGAKCmBgYHtyfQpjZWxsdHlwZXMgPC0gYygiQ0Q2OCtDRDQrIE1vbm9jeXRlcyIgPSAiQ0Q2OCtDRDQrIE1vbm8iLCAKICAgICAgICAgICAgICAgIkNENjgrSUwxOCtUTFI0K1RSRU0yKyBSZXNpZGVudCBtYWNyb3BoYWdlcyIgPSAiQ0Q2OCtJTDE4K1RMUjQrVFJFTTIrIE1SZXMiLCAKICAgICAgICAgICAgICAgIkNENjgrQ0QxQysgRGVuZHJpdGljIENlbGxzIiA9ICJDRDY4K0NEMUMrIERDIiwKICAgICAgICAgICAgICAgIkNENjgrQ0FTUDErSUwxQitTRUxMKyBJbmZsYW1tYXRvcnkgbWFjcm9waGFnZXMiID0gIkNENjgrQ0FTUDErSUwxQitTRUxMIE1JbmYiLAogICAgICAgICAgICAgICAiQ0Q2OCtBQkNBMStPTFIxK1RSRU0yKyBGb2FtIENlbGxzIiA9ICJDRDY4K0FCQ0ExK09MUjErVFJFTTIrIEZDIiwKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICMgVC1jZWxscwogICAgICAgICAgICAgICAiQ0QzKyBUIENlbGxzIEkiID0gIkNEMysgVEMgSSIsCiAgICAgICAgICAgICAgICJDRDMrIFQgQ2VsbHMgSUkiID0gIkNEMysgVEMgSUkiLCAKICAgICAgICAgICAgICAgIkNEMysgVCBDZWxscyBJSUkiID0gIkNEMysgVEMgSUlJIiwgCiAgICAgICAgICAgICAgICJDRDMrIFQgQ2VsbHMgSVYiID0gIkNEMysgVEMgSVYiLCAKICAgICAgICAgICAgICAgIkNEMysgVCBDZWxscyBWIiA9ICJDRDMrIFRDIFYiLCAKICAgICAgICAgICAgICAgIkNEMysgVCBDZWxscyBWSSIgPSAiQ0QzKyBUQyBWSSIsIAogICAgICAgICAgICAgICAiRk9YUDMrIFQgQ2VsbHMiID0gIkZPWFAzKyBUQyIsCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAjIEVuZG90aGVsaWFsIGNlbGxzCiAgICAgICAgICAgICAgICJDRDM0KyBFbmRvdGhlbGlhbCBDZWxscyBJIiA9ICJDRDM0KyBFQyBJIiwgCiAgICAgICAgICAgICAgICJDRDM0KyBFbmRvdGhlbGlhbCBDZWxscyBJSSIgPSAiQ0QzNCsgRUMgSUkiLCAKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICMgU01DCiAgICAgICAgICAgICAgICJBQ1RBMisgU21vb3RoIE11c2NsZSBDZWxscyIgPSAiQUNUQTIrIFNNQyIsIAogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIyBOSyBDZWxscwogICAgICAgICAgICAgICAiQ0QzK0NENTYrIE5LIENlbGxzIEkiID0gIkNEMytDRDU2KyBOSyBJIiwKICAgICAgICAgICAgICAgIkNEMytDRDU2KyBOSyBDZWxscyBJSSIgPSAiQ0QzK0NENTYrIE5LIElJIiwKICAgICAgICAgICAgICAgIyBNYXN0CiAgICAgICAgICAgICAgICJDRDY4K0tJVCsgTWFzdCBDZWxscyIgPSAiQ0Q2OCtLSVQrIE1DIiwKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICJDRDc5QSsgQ2xhc3Mtc3dpdGNoZWQgTWVtb3J5IEIgQ2VsbHMiID0gIkNENzlBKyBCQ21lbSIsIAogICAgICAgICAgICAgICAiQ0Q3OSsgUGxhc21hIEIgQ2VsbHMiID0gIkNENzkrIEJDcGxhc21hIikKCnNjUk5Bc2VxRGF0YSA8LSBTZXVyYXQ6OlJlbmFtZUlkZW50cyhvYmplY3QgPSBzY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsdHlwZXMpCmBgYAoKYGBge3IgQ2hhbmdlIGNlbGwgY3VtbXVuaXR5IG5hbWVzIC0gbmV3IHBsb3R9ClVNQVBQbG90KHNjUk5Bc2VxRGF0YSwgbGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMS4yNSwgbGFiZWwuc2l6ZSA9IDQsIGdyb3VwLmJ5ID0gImlkZW50IiwKICAgICAgICAgcmVwZWwgPSBUUlVFKQoKYGBgCgojIyBDbGluaWNhbCBkYXRhCgpMb2FkaW5nIHRoZSBBdGhlcm8tRXhwcmVzcyBjbGluaWNhbCBkYXRhLgoKYGBge3IgTG9hZEFFREJ9CgpBRURCLkNFQSA8LSByZWFkUkRTKGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8yMDIzMDYxNC4iLFBST0pFQ1ROQU1FLCIuQUVEQi5DRUEuUkRTIikpCgpgYGAKCgpgYGB7ciB9CgojIEJhc2VsaW5lIHRhYmxlIHZhcmlhYmxlcwpiYXNldGFibGVfdmFycyA9IGMoIkhvc3BpdGFsIiwgIk9SeWVhciIsICJBcnRlcnlfc3VtbWFyeSIsCiAgICAgICAgICAgICAgICAgICAiQWdlIiwgIkdlbmRlciIsIAogICAgICAgICAgICAgICAgICAgIyAiVENfZmluYWxDVSIsICJMRExfZmluYWxDVSIsICJIRExfZmluYWxDVSIsICJUR19maW5hbENVIiwgCiAgICAgICAgICAgICAgICAgICAiVENfZmluYWwiLCAiTERMX2ZpbmFsIiwgIkhETF9maW5hbCIsICJUR19maW5hbCIsIAogICAgICAgICAgICAgICAgICAgIyAiaHNDUlBfcGxhc21hIiwKICAgICAgICAgICAgICAgICAgICJzeXN0b2xpYyIsICJkaWFzdG9saSIsICJHRlJfTURSRCIsICJCTUkiLCAKICAgICAgICAgICAgICAgICAgICJLRE9RSSIsICJCTUlfV0hPIiwKICAgICAgICAgICAgICAgICAgICJTbW9rZXJTdGF0dXMiLCAiQWxjb2hvbFVzZSIsCiAgICAgICAgICAgICAgICAgICAiRGlhYmV0ZXNTdGF0dXMiLCAKICAgICAgICAgICAgICAgICAgICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCIsICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydGRydWciLCAiSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSIsICJIeXBlcnRlbnNpb24uZHJ1Z3MiLCAKICAgICAgICAgICAgICAgICAgICJNZWQuYW50aWNvYWd1bGFudHMiLCAiTWVkLmFsbC5hbnRpcGxhdGVsZXQiLCAiTWVkLlN0YXRpbi5MTEQiLCAKICAgICAgICAgICAgICAgICAgICJTdHJva2VfRHgiLCAic3ltcHQiLCAiU3ltcHRvbXMuNUciLCAiQXN5bXB0U3ltcHQiLCAiQXN5bXB0U3ltcHQyRyIsCiAgICAgICAgICAgICAgICAgICAiU3ltcHRvbXMuVXBkYXRlMkciLCAiU3ltcHRvbXMuVXBkYXRlM0ciLCAiaW5kZXhzeW1wdG9tc19sYXRlc3RfNGciLAogICAgICAgICAgICAgICAgICAgInJlc3Rlbm9zIiwgInN0ZW5vc2UiLCAKICAgICAgICAgICAgICAgICAgICJDQURfaGlzdG9yeSIsICJQQU9EIiwgIlBlcmlwaGVyYWwuaW50ZXJ2IiwgCiAgICAgICAgICAgICAgICAgICAiRVBfY29tcG9zaXRlIiwgIkVQX2NvbXBvc2l0ZV90aW1lIiwgIkVQX21ham9yIiwgIkVQX21ham9yX3RpbWUiLAogICAgICAgICAgICAgICAgICAgIk1BQ19yYW5rTm9ybSIsICJTTUNfcmFua05vcm0iLCAiTWFjcm9waGFnZXMuYmluIiwgIlNNQy5iaW4iLAogICAgICAgICAgICAgICAgICAgIk5ldXRyb3BoaWxzX3JhbmtOb3JtIiwgIk1hc3RDZWxsc19yYW5rTm9ybSIsCiAgICAgICAgICAgICAgICAgICAiSVBILmJpbiIsICJWZXNzZWxEZW5zaXR5X3JhbmtOb3JtIiwKICAgICAgICAgICAgICAgICAgICJDYWxjLmJpbiIsICJDb2xsYWdlbi5iaW4iLCAKICAgICAgICAgICAgICAgICAgICJGYXQuYmluXzEwIiwgIkZhdC5iaW5fNDAiLCAiT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZSIsICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgICAiUENTSzlfcGxhc21hIiwgIlBDU0s5X3BsYXNtYV9yYW5rTm9ybSIpCgpiYXNldGFibGVfYmluID0gYygiR2VuZGVyIiwgICJBcnRlcnlfc3VtbWFyeSIsCiAgICAgICAgICAgICAgICAgICJLRE9RSSIsICJCTUlfV0hPIiwKICAgICAgICAgICAgICAgICAgIlNtb2tlclN0YXR1cyIsICJBbGNvaG9sVXNlIiwKICAgICAgICAgICAgICAgICAgIkRpYWJldGVzU3RhdHVzIiwgCiAgICAgICAgICAgICAgICAgICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCIsICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydGRydWciLCAiSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSIsICJIeXBlcnRlbnNpb24uZHJ1Z3MiLCAKICAgICAgICAgICAgICAgICAgIk1lZC5hbnRpY29hZ3VsYW50cyIsICJNZWQuYWxsLmFudGlwbGF0ZWxldCIsICJNZWQuU3RhdGluLkxMRCIsIAogICAgICAgICAgICAgICAgICAiU3Ryb2tlX0R4IiwgInN5bXB0IiwgIlN5bXB0b21zLjVHIiwgIkFzeW1wdFN5bXB0IiwgIkFzeW1wdFN5bXB0MkciLAogICAgICAgICAgICAgICAgICAiU3ltcHRvbXMuVXBkYXRlMkciLCAiU3ltcHRvbXMuVXBkYXRlM0ciLCAiaW5kZXhzeW1wdG9tc19sYXRlc3RfNGciLAogICAgICAgICAgICAgICAgICAicmVzdGVub3MiLCAic3Rlbm9zZSIsCiAgICAgICAgICAgICAgICAgICJDQURfaGlzdG9yeSIsICJQQU9EIiwgIlBlcmlwaGVyYWwuaW50ZXJ2IiwgCiAgICAgICAgICAgICAgICAgICJFUF9tYWpvciIsICJFUF9jb21wb3NpdGUiLCAiTWFjcm9waGFnZXMuYmluIiwgIlNNQy5iaW4iLAogICAgICAgICAgICAgICAgICAiSVBILmJpbiIsIAogICAgICAgICAgICAgICAgICAiQ2FsYy5iaW4iLCAiQ29sbGFnZW4uYmluIiwgCiAgICAgICAgICAgICAgICAgICJGYXQuYmluXzEwIiwgIkZhdC5iaW5fNDAiLCAiT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZSIsICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIpCiMgYmFzZXRhYmxlX2JpbgoKYmFzZXRhYmxlX2NvbiA9IGJhc2V0YWJsZV92YXJzWyFiYXNldGFibGVfdmFycyAlaW4lIGJhc2V0YWJsZV9iaW5dCiMgYmFzZXRhYmxlX2NvbgpgYGAKCiMjIEFFU0NSTkE6IGJhc2VsaW5lIGNoYXJhY3RlcmlzdGljcwoKIyMjIFByZXBhcmF0aW9uCgpgYGB7ciBCYXNlbGluZTogY3JlYXRpb259Cm1ldGFkYXRhIDwtIHNjUk5Bc2VxRGF0YUBtZXRhLmRhdGEgJT4lIGFzX3RpYmJsZSgpICU+JSBzZXBhcmF0ZShvcmlnLmlkZW50LCBjKCJQYXRpZW50IiwgTkEpKQpzY1JOQXNlcURhdGFNZXRhIDwtIG1ldGFkYXRhICU+JSBkaXN0aW5jdChQYXRpZW50LCAua2VlcF9hbGwgPSBUUlVFKQoKc2NSTkFzZXFEYXRhTWV0YUFFIDwtIG1lcmdlKHNjUk5Bc2VxRGF0YU1ldGEsIEFFREIuQ0VBLCBieS54ID0gIlBhdGllbnQiLCBieS55ID0gIlNUVURZX05VTUJFUiIsIHNvcnQgPSBGQUxTRSwgYWxsLnggPSBUUlVFKQpkaW0oc2NSTkFzZXFEYXRhTWV0YUFFKQoKIyBSZXBsYWNlIG1pc3NpbmcgZGF0YSAKIyBSZWY6IGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9uYW5pYXIvdmlnbmV0dGVzL3JlcGxhY2Utd2l0aC1uYS5odG1sCnJlcXVpcmUobmFuaWFyKQoKbmFfc3RyaW5ncyA8LSBjKCJOQSIsICJOIEEiLCAiTiAvIEEiLCAiTi9BIiwgIk4vIEEiLCAKICAgICAgICAgICAgICAgICJOb3QgQXZhaWxhYmxlIiwgIk5vdCBhdmFpbGFibGUiLCAKICAgICAgICAgICAgICAgICJtaXNzaW5nIiwgCiAgICAgICAgICAgICAgICAiLTk5OSIsICItOTkiLCAKICAgICAgICAgICAgICAgICJObyBkYXRhIGF2YWlsYWJsZS9taXNzaW5nIiwgIk5vIGRhdGEgYXZhaWxhYmxlL01pc3NpbmciKQojIFRoZW4geW91IHdyaXRlIH4ueCAlaW4lIG5hX3N0cmluZ3MgLSB3aGljaCByZWFkcyBhcyDigJxkb2VzIHRoaXMgdmFsdWUgb2NjdXIgaW4gdGhlIGxpc3Qgb2YgTkEgc3RyaW5nc+KAnS4KCnNjUk5Bc2VxRGF0YU1ldGFBRSAlPiUKICByZXBsYWNlX3dpdGhfbmFfYWxsKGNvbmRpdGlvbiA9IH4ueCAlaW4lIG5hX3N0cmluZ3MpCmBgYAoKYGBge3IgfQpjYXQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKQpjYXQoIlNFTEVDVElPTiBUSEUgU0hJWlpMRSIpCgpjYXQoIi0gc2FuaXR5IGNoZWNraW5nIFBSSU9SIHRvIHNlbGVjdGlvbiIpCmxpYnJhcnkoZGF0YS50YWJsZSkKcmVxdWlyZShsYWJlbGxlZCkKYWUuZ2VuZGVyIDwtIHRvX2ZhY3RvcihzY1JOQXNlcURhdGFNZXRhQUUkR2VuZGVyKQphZS5ob3NwaXRhbCA8LSB0b19mYWN0b3Ioc2NSTkFzZXFEYXRhTWV0YUFFJEhvc3BpdGFsKQp0YWJsZShhZS5nZW5kZXIsIGFlLmhvc3BpdGFsLCBkbm4gPSBjKCJTZXgiLCAiSG9zcGl0YWwiKSwgdXNlTkEgPSAiaWZhbnkiKQoKYWUuYXJ0ZXJ5IDwtIHRvX2ZhY3RvcihzY1JOQXNlcURhdGFNZXRhQUUkQXJ0ZXJ5X3N1bW1hcnkpCnRhYmxlKGFlLmFydGVyeSwgYWUuZ2VuZGVyLCBkbm4gPSBjKCJTZXgiLCAiQXJ0ZXJ5IiksIHVzZU5BID0gImlmYW55IikKCmFlLmljIDwtIHRvX2ZhY3RvcihzY1JOQXNlcURhdGFNZXRhQUUkaW5mb3JtZWRjb25zZW50KQp0YWJsZShhZS5pYywgYWUuZ2VuZGVyLCB1c2VOQSA9ICJpZmFueSIpCgpybShhZS5nZW5kZXIsIGFlLmhvc3BpdGFsLCBhZS5hcnRlcnksIGFlLmljKQoKCnNjUk5Bc2VxRGF0YU1ldGFBRS5hbGwgPC0gc3Vic2V0KHNjUk5Bc2VxRGF0YU1ldGFBRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFydGVyeV9zdW1tYXJ5ID09ICJjYXJvdGlkIChsZWZ0ICYgcmlnaHQpIiB8IEFydGVyeV9zdW1tYXJ5ID09ICJvdGhlciBjYXJvdGlkIGFydGVyaWVzIChjb21tb24sIGV4dGVybmFsKSIgKSAmICMgd2Ugb25seSB3YW50IGNhcm90aWRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJtaXNzaW5nIiAmICMgd2UgYXJlIHJlYWxseSBzdHJpY3QgaW4gc2VsZWN0aW5nIGJhc2VkIG9uICdpbmZvcm1lZCBjb25zZW50JyEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBkaWVkIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gY29tbWVyaWNhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyaWNhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBoZWFsdGggdHJlYXRtZW50IiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgZG9lc24ndCB3YW50IHRvIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgdW5hYmxlIHRvIHNpZ24iICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBubyByZWFjdGlvbiIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGxvc3QiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCB0b28gb2xkIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIG1lZGljYWwgaW5mbywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8gKG5ldmVyIGFza2VkIGZvciBJQyBiZWNhdXNlIHRoZXJlIHdhcyBubyB0aXNzdWUpIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgZW5kcG9pbnQiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vb2l0IGdlaW5jbHVkZWVyZCIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJiAjIElNUE9SVEFOVDogc2luY2Ugd2UgYXJlIHNoYXJpbmcgd2l0aCBhIGNvbW1lcmNpYWwgcGFydHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gY29tbWVyaWNhbCBidXNpbmVzcyIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyBxdWVzdGlvbm5haXJlcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAic2Vjb25kIGluZm9ybWVkIGNvbmNlbnRzOiB5ZXMsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiKQojIHNjUk5Bc2VxRGF0YU1ldGFBRS5hbGxbMToxMCwgMToxMF0KZGltKHNjUk5Bc2VxRGF0YU1ldGFBRS5hbGwpCiMgRFQ6OmRhdGF0YWJsZShzY1JOQXNlcURhdGFNZXRhQUUuYWxsKQoKYGBgCgojIyMgQmFzZWxpbmUKClNob3dpbmcgdGhlIGJhc2VsaW5lIHRhYmxlIGZvciB0aGUgc2NSTkFzZXEgZGF0YSBpbiAzOSBDRUEgcGF0aWVudHMgd2l0aAppbmZvcm1lZCBjb25zZW50LgoKYGBge3IgQmFzZWxpbmU6IFZpc3VhbGl6ZX0KY2F0KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IikKY2F0KCJDUkVBVEUgQkFTRUxJTkUgVEFCTEUiKQoKIyBDcmVhdGUgYmFzZWxpbmUgdGFibGVzCiMgaHR0cDovL3JzdHVkaW8tcHVicy1zdGF0aWMuczMuYW1hem9uYXdzLmNvbS8xMzMyMV9kYTMxNDYzM2RiOTI0ZGM3ODk4NmE4NTA4MTNhNTBkNS5odG1sCnNjUk5Bc2VxRGF0YU1ldGFBRS5hbGwudGFibGVPbmUgPSBwcmludChDcmVhdGVUYWJsZU9uZSh2YXJzID0gYmFzZXRhYmxlX3ZhcnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmFjdG9yVmFycyA9IGJhc2V0YWJsZV9iaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdHJhdGEgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc2NSTkFzZXFEYXRhTWV0YUFFLmFsbCwgaW5jbHVkZU5BID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbm5vcm1hbCA9IGMoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBGQUxTRSwgc2hvd0FsbExldmVscyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gInAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250RGlnaXRzID0gMylbLDE6Ml0KCmBgYAoKV3JpdGluZyB0aGUgYmFzZWxpbmUgdGFibGUgdG8gRXhjZWwgZm9ybWF0LgoKYGBge3IgfQojIFdyaXRlIGJhc2V0YWJsZQpyZXF1aXJlKG9wZW54bHN4KQojIHdyaXRlLnhsc3goZmlsZSA9IHBhc3RlMChCQVNFTElORV9sb2MsICIvIixUb2RheSwiLiIsUFJPSkVDVE5BTUUsIi5BRVNDUk5BLjMycHRzLmFmdGVyX3FjLklDX2NvbW1lcmNpYWwuQmFzZWxpbmVUYWJsZS54bHN4IiksIAojICAgICAgICAgICAgZm9ybWF0KGFzLmRhdGEuZnJhbWUoc2NSTkFzZXFEYXRhTWV0YUFFLmFsbC50YWJsZU9uZSksIGRpZ2l0cyA9IDUsIHNjaWVudGlmaWMgPSBGQUxTRSksCiMgICAgICAgICAgICByb3dOYW1lcyA9IFRSVUUsIGNvbE5hbWVzID0gVFJVRSwgCiMgICAgICAgICAgICBzaGVldE5hbWUgPSAiQUVTQ1JOQSIsIG92ZXJ3cml0ZSA9IFRSVUUpCndyaXRlLnhsc3goZmlsZSA9IHBhc3RlMChCQVNFTElORV9sb2MsICIvIixUb2RheSwiLiIsUFJPSkVDVE5BTUUsIi5BRVNDUk5BLkNFQS4zOXB0cy5hZnRlcl9xYy5JQ19hY2FkZW1pYy5CYXNlbGluZVRhYmxlLnhsc3giKSwKICAgICAgICAgICBmb3JtYXQoYXMuZGF0YS5mcmFtZShzY1JOQXNlcURhdGFNZXRhQUUuYWxsLnRhYmxlT25lKSwgZGlnaXRzID0gNSwgc2NpZW50aWZpYyA9IEZBTFNFKSwKICAgICAgICAgICByb3dOYW1lcyA9IFRSVUUsIGNvbE5hbWVzID0gVFJVRSwKICAgICAgICAgICBzaGVldE5hbWUgPSAiQUVTQ1JOQV9DRUEiLCBvdmVyd3JpdGUgPSBUUlVFKQoKYGBgCgojIEFFU0NSTkEKCiMjIFF1YWxpdHkgY29udHJvbAoKSGVyZSByZXZpZXcgdGhlIG51bWJlciBvZiBjZWxscyBwZXIgc2FtcGxlLCBwbGF0ZSwgYW5kIHBhdGllbnRzLiBBbmQgcGxvdCB0aGUKcmF0aW8ncyBwZXIgc2FtcGxlIGFuZCBzdHVkeSBudW1iZXIuCgpgYGB7ciBRdWFsaXR5Q29udHJvbH0KIyMgY2hlY2sgc3R1ZmYKY2F0KCJcbkhvdyBtYW55IGNlbGxzIHBlciB0eXBlIC4uLj8iKQpzb3J0KHRhYmxlKHNjUk5Bc2VxRGF0YUBtZXRhLmRhdGEkU0NUX3Nubl9yZXMuMC44KSkKCiMgY2F0KCJcblxuSG93IG1hbnkgY2VsbHMgcGVyIHBsYXRlIC4uLj8iKQojIHNvcnQodGFibGUoc2NSTkFzZXFEYXRhQG1ldGEuZGF0YSRJRCkpCgojIGNhdCgiXG5cbkhvdyBtYW55IGNlbGxzIHBlciB0eXBlIHBlciBwbGF0ZSAuLi4/IikKIyB0YWJsZShzY1JOQXNlcURhdGFAbWV0YS5kYXRhJFNDVF9zbm5fcmVzLjAuOCwgc2NSTkFzZXFEYXRhQG1ldGEuZGF0YSRJRCkKCmNhdCgiXG5cbkhvdyBtYW55IGNlbGxzIHBlciBwYXRpZW50IC4uLj8iKQpzb3J0KHRhYmxlKHNjUk5Bc2VxRGF0YUBtZXRhLmRhdGEkUGF0aWVudCkpCgpjYXQoIlxuXG5WaXN1YWxpemluZyB0aGVzZSByYXRpbydzIHBlciBzdHVkeSBudW1iZXIgYW5kIHNhbXBsZSAuLi4/IikKVU1BUFBsb3Qoc2NSTkFzZXFEYXRhLCBsYWJlbCA9IFRSVUUsIHB0LnNpemUgPSAxLjI1LCBsYWJlbC5zaXplID0gNCwgZ3JvdXAuYnkgPSAiaWRlbnQiLAogICAgICAgICByZXBlbCA9IFRSVUUpCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuVU1BUC5wbmciKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlVNQVAucHMiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKCiMgYmFycGxvdChwcm9wLnRhYmxlKHggPSB0YWJsZShzY1JOQXNlcURhdGFAYWN0aXZlLmlkZW50LCBzY1JOQXNlcURhdGFAbWV0YS5kYXRhJFBhdGllbnQpKSwgCiMgICAgICAgICBjZXguYXhpcyA9IDEuMCwgY2V4Lm5hbWVzID0gMC41LCBsYXMgPSAxLAojICAgICAgICAgY29sID0gdWl0aG9mX2NvbG9yLCB4bGFiID0gInN0dWR5IG51bWJlciIsIGxlZ2VuZC50ZXh0ID0gRkFMU0UsIGFyZ3MubGVnZW5kID0gbGlzdCh4ID0gImJvdHRvbSIpKQojIGRldi5jb3B5KHBkZiwgcGFzdGUwKFFDX2xvYywgIi8iLCBUb2RheSwgIi5jZWxsX3JhdGlvc19wZXJfc2FtcGxlLnBkZiIpKQojIGRldi5vZmYoKQoKIyBiYXJwbG90KHByb3AudGFibGUoeCA9IHRhYmxlKHNjUk5Bc2VxRGF0YUBhY3RpdmUuaWRlbnQsIHNjUk5Bc2VxRGF0YUBtZXRhLmRhdGEkSUQpKSwgCiMgICAgICAgICBjZXguYXhpcyA9IDEuMCwgY2V4Lm5hbWVzID0gMC41LCBsYXMgPSAyLAojICAgICAgICAgY29sID0gdWl0aG9mX2NvbG9yLCB4bGFiID0gInNhbXBsZSBJRCIsIGxlZ2VuZC50ZXh0ID0gRkFMU0UsIGFyZ3MubGVnZW5kID0gbGlzdCh4ID0gImJvdHRvbSIpKQojIGRldi5jb3B5KHBkZiwgcGFzdGUwKFFDX2xvYywgIi8iLCBUb2RheSwgIi5jZWxsX3JhdGlvc19wZXJfc2FtcGxlX3Blcl9wbGF0ZS5wZGYiKSkKIyBkZXYub2ZmKCkKCgoKYGBgCgojIyBWaXN1YWxpc2F0aW9ucwoKTGV0J3MgcHJvamVjdCBrbm93biBjZWxsdWxhciBtYXJrZXJzLgoKYGBge3IgVmlzdWFsaXNhdGlvbjogdFNORSBFeHBsb3JhdGlvbn0KClVNQVBQbG90KHNjUk5Bc2VxRGF0YSwgbGFiZWwgPSBGQUxTRSwgcHQuc2l6ZSA9IDEuMjUsIGxhYmVsLnNpemUgPSA0LCBncm91cC5ieSA9ICJpZGVudCIsCiAgICAgICAgIHJlcGVsID0gVFJVRSkKCiMgZW5kb3RoZWxpYWwgY2VsbHMKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkNEMzQiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkVETjEiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkVETlJBIiwgIkVETlJCIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJDREg1IiwgIlBFQ0FNMSIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiQUNLUjEiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKCiMgU01DCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJNWUgxMSIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiTEdBTFMzIiwgIkFDVEEyIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCgojIG1hY3JvcGhhZ2VzCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJDRDE0IiwgIkNENjgiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkNEMzYiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKCiMgdC1jZWxscwpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiQ0QzRSIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiQ0Q0IiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCiMgRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkNEOCIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQoKIyBiLWNlbGxzCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJDRDc5QSIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQoKIyBtYXN0IGNlbGxzCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJLSVQiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKCiMgTksgY2VsbHMKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIk5DQU0xIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCgpgYGAKCiMjIFRhcmdldHMgb2YgaW50ZXJlc3Q6CgpXZSBjaGVjayB3aGV0aGVyIHRoZSB0YXJnZXRzIGdlbmVzIHdlcmUgc2VxdWVuY2VkIHVzaW5nIG91ciBtZXRob2QuIEluIGNhc2Ugc29tZSBnZW5lcyBhcmUgbm90IGF2YWlsYWJsZSBpbiBvdXIgZGF0YSB3ZSBjb3VsZCBmaWx0ZXIgdGhlbSBoZXJlLgoKYGBge3IgbGlzdCB0YXJnZXQgZ2VuZXN9CnRhcmdldF9nZW5lcyA8LSBnZW5lX2xpc3QKdGFyZ2V0X2dlbmVzCgpgYGAKCgpUaGlzIGNvZGUgaXMganVzdCBhbiBleGFtcGxlIHRvIGZpbHRlciB0aGUgbGlzdCBmcm9tIGdlbmVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgZGF0YS4KCi0gX0NPTDNBXyA9PT4gbm90IGZvdW5kCi0gX0NPTDJBXyA9PT4gbm90IGZvdW5kCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBwcmVwYXJhdGlvbn0KCmdlbmVfbGlzdF9ybSA8LSBjKCJDT0wzQSIsICJDT0wyQSIpIAoKdGVtcCA9IHRhcmdldF9nZW5lc1shdGFyZ2V0X2dlbmVzICVpbiUgZ2VuZV9saXN0X3JtXQoKdGFyZ2V0X2dlbmVzX3FjIDwtIGModGVtcCkKCiMgZ2VuZV9saXN0X3FjIDwtIGdlbmVfbGlzdAojIAojIGZvciBkZWJ1ZwojIGdlbmVfbGlzdF9xY19yZXBsYWNlIDwtIGMoIk1SVEZBIikKCiMgdGFyZ2V0X2dlbmVzX3FjIDwtIHRhcmdldF9nZW5lcwp0YXJnZXRfZ2VuZXNfcWMKCmBgYAoKCiMjIyBFeHByZXNzaW9uIGluIGNlbGwgY29tbXVuaXRpZXMKCmBgYHtyIFZpc3VhbGlzYXRpb246IFRhcmdldHMgRmVhdHVyZSBhbmQgRG90IFBsb3RzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKCnAxIDwtIERvdFBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IHRhcmdldF9nZW5lc19xYywKICAgICAgICBjb2xzID0gIlJkQnUiKQoKcDEgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xLCBzaXplID0gNSkpCgpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLkRvdFBsb3QuVGFyZ2V0cy5wbmciKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLkRvdFBsb3QuVGFyZ2V0cy5wcyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuRG90UGxvdC5UYXJnZXRzLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgpybShwMSkKCiMgRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGModGFyZ2V0X2dlbmVzX3FjKSwKIyAgICAgICAgICAgICBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIsICIjOUEzNDgwIiwiIzEyOTBEOSIpLAojICAgICAgICAgICAgIGNvbWJpbmUgPSBUUlVFKQojIAojIGdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuRmVhdHVyZVBsb3QuVGFyZ2V0cy5wbmciKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQojIGdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuRmVhdHVyZVBsb3QuVGFyZ2V0cy5wcyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgoKYGBgCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBUYXJnZXRzfQojIFZsblBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9ICJEVVNQMjciKQoKIyBWbG5QbG90IGZpbGVzCmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoUExPVF9sb2MsICIvVmxuUGxvdCIpKSwgCiAgICAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChQTE9UX2xvYywgIi9WbG5QbG90IikpLCAKICAgICAgIEZBTFNFKQpWbG5QbG90X2xvYyA9IHBhc3RlMChQTE9UX2xvYywgIi9WbG5QbG90IikKCgpmb3IgKEdFTkUgaW4gdGFyZ2V0X2dlbmVzX3FjKXsKICBwcmludChwYXN0ZTAoIlByb2plY3RpbmcgdGhlIGV4cHJlc3Npb24gb2YgIiwgR0VORSwgIi4iKSkKCiAgdnAxIDwtICBWbG5QbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBHRU5FKSArIAogICAgeGxhYigiY2VsbCBjb21tdW5pdGllcyIpICsgCiAgICB5bGFiKGJxdW90ZSgibm9ybWFsaXplZCBleHByZXNzaW9uIikpICsKICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwgCiAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwgCiAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICAgIGdnc2F2ZShwYXN0ZTAoVmxuUGxvdF9sb2MsICIvIiwgVG9kYXksICIuVmxuUGxvdC4iLEdFTkUsIi5wbmciKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQogICAgZ2dzYXZlKHBhc3RlMChWbG5QbG90X2xvYywgIi8iLCBUb2RheSwgIi5WbG5QbG90LiIsR0VORSwiLnBzIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKICAgIGdnc2F2ZShwYXN0ZTAoVmxuUGxvdF9sb2MsICIvIiwgVG9kYXksICIuVmxuUGxvdC4iLEdFTkUsIi5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQogIAogICMgcHJpbnQodnAxKQogIAp9CgpgYGAKCiMjIyBEaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBiZXR3ZWVuIGNlbGwgY29tbXVuaXRpZXMKCkhlcmUgd2UgcHJvamVjdCBnZW5lcyB0byBvbmx5IHRoZSBicm9hZCBjZWxsIGNvbW11bml0aWVzOgoKLSAgIG1hY3JvcGhhZ2VzCi0gICBlbmRvdGhlbGlhbCBjZWxscwotICAgc21vb3RoIG11c2NsZSBjZWxscwotICAgVC1jZWxscwotICAgQi1jZWxscwotICAgTWFzdCBjZWxscwotICAgTkstY2VsbHMKLSAgIE1peGVkIGNlbGxzCgojIyMjIE1hY3JvcGhhZ2VzCgpgYGB7cn0KdW5pcXVlKHNjUk5Bc2VxRGF0YUBhY3RpdmUuaWRlbnQpCmBgYAoKQ29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBtYWNyb3BoYWdlcyBjZWxsIGNvbW11bml0aWVzICgqQ0QxNC9DRDY4KjxzdXA+Kzwvc3VwPiksCmFuZCBhbGwgb3RoZXIgY29tbXVuaXRpZXMuCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIE1BQyBjYWxjdWxhdGV9CgpNQUMubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKCJDRDY4K0NBU1AxK0lMMUIrU0VMTCBNSW5mIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrQ0QxQysgREMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtDRDQrIE1vbm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0lMMTgrVExSNCtUUkVNMisgTVJlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrQUJDQTErT0xSMStUUkVNMisgRkMiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoIyJDRDY4K0NBU1AxK0lMMUIrU0VMTCBNSW5mIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyJDRDY4K0NEMUMrIERDIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyJDRDY4K0NENCsgTW9ubyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyJDRDY4K0lMMTgrVExSNCtUUkVNMisgTVJlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyJDRDY4K0FCQ0ExK09MUjErVFJFTTIrIEZDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIElWIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgViIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIFZJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZPWFAzKyBUQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIElJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUNUQTIrIFNNQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q1NisgTksgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDU2KyBOSyBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0tJVCsgTUMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5KyBCQ3BsYXNtYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQkNtZW0iKSkKCkRUOjpkYXRhdGFibGUoTUFDLm1hcmtlcnMpCmBgYAoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBNQUMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Ck1BQ19Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKE1BQy5tYXJrZXJzLAogICAgbGFiID0gcm93bmFtZXMoTUFDLm1hcmtlcnMpLAogICAgeCA9ICJhdmdfbG9nMkZDIiwKICAgIHkgPSAicF92YWxfYWRqIiwKICAgIHNlbGVjdExhYiA9IHRhcmdldF9nZW5lc19xYywKICAgIGF4aXNMYWJTaXplID0gMTIsCiAgICB4bGFiID0gImF2ZXJhZ2UgZm9sZC1jaGFuZ2UiLAogICAgdGl0bGUgPSAiTWFjcm9waGFnZSBtYXJrZXJzXG4oTWFjcm9waGFnZSBjb21tdW5pdGllcyB2cyB0aGUgcmVzdCkiLAogICAgdGl0bGVMYWJTaXplID0gMTQsCiAgICBwQ3V0b2ZmID0gMC4wNS8obnJvdyhNQUMubWFya2VycykpLCAjIDIwNTUyIGdlbmVzCiAgICBGQ2N1dG9mZiA9IDEuMjUsCiAgICBwb2ludFNpemUgPSAxLjUsCiAgICBsYWJTaXplID0gMy4wLAogICAgbGVnZW5kTGFiZWxzID1jKCdOUycsJ2F2Zy4gZm9sZC1jaGFuZ2UnLCdQJywKICAgICAgJ1AgJiBhdmcuIGZvbGQtY2hhbmdlJyksCiAgICBsZWdlbmRQb3NpdGlvbiA9ICJyaWdodCIsCiAgICBsZWdlbmRMYWJTaXplID0gMTAsCiAgICBsZWdlbmRJY29uU2l6ZSA9IDMuMCwKICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwKICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuMiwKICAgIGNvbENvbm5lY3RvcnMgPSAiIzU5NUE1QyIsCiAgICBncmlkbGluZXMubWFqb3IgPSBGQUxTRSwKICAgIGdyaWRsaW5lcy5taW5vciA9IEZBTFNFKQpNQUNfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uTUFDLkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBNQUNfVm9sY2Fub19UYXJnZXRzQSkKYGBgCgpUaGUgdGFyZ2V0IHJlc3VsdHMgYXJlIGdpdmVuIGJlbG93IGFuZCB3cml0dGVuIHRvIGEgZmlsZS4KCmBgYHtyIFJlc3VsdHMgTUFDfQpsaWJyYXJ5KHRpYmJsZSkKTUFDLm1hcmtlcnMgPC0gYWRkX2NvbHVtbihNQUMubWFya2VycywgR2VuZSA9IHJvdy5uYW1lcyhNQUMubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBNQUMubWFya2Vyc1tNQUMubWFya2VycyRHZW5lICVpbiUgdGFyZ2V0X2dlbmVzX3FjLF0KCkRUOjpkYXRhdGFibGUodGVtcCkKYGBgCgpgYGB7ciBSZXN1bHRzIE1BQzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5NQUMuREVHLlRhcmdldHMudHh0IiksCiAgICAgICBxdW90ZSA9IEZBTFNFLAogICAgICAgc2VwID0gIlx0IiwgCiAgICAgICBzaG93UHJvZ3Jlc3MgPSBGQUxTRSwgdmVyYm9zZSA9IEZBTFNFKQpgYGAKCiMjIyMgU21vb3RoIG11c2NsZSBjZWxscwoKQ29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzbW9vdGggbXVzY2xlIGNlbGwgY29tbXVuaXRpZXMgKCpBQ1RBMio8c3VwPis8L3N1cD4pLCBhbmQKYWxsIG90aGVyIGNvbW11bml0aWVzLgoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBTTUMgY2FsY3VsYXRlfQoKU01DLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiQUNUQTIrIFNNQyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygiQ0Q2OCtDQVNQMStJTDFCK1NFTEwgTUluZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0NEMUMrIERDIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrQ0Q0KyBNb25vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtJTDE4K1RMUjQrVFJFTTIrIE1SZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0FCQ0ExK09MUjErVFJFTTIrIEZDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIElWIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgViIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIFZJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZPWFAzKyBUQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIElJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIkFDVEEyKyBTTUMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENTYrIE5LIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q1NisgTksgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtLSVQrIE1DIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OSsgQkNwbGFzbWEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEJDbWVtIikpCgpEVDo6ZGF0YXRhYmxlKFNNQy5tYXJrZXJzKQpgYGAKCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gU01DLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpTTUNfVm9sY2Fub19UYXJnZXRzQSA9IEVuaGFuY2VkVm9sY2FubyhTTUMubWFya2VycywKICAgIGxhYiA9IHJvd25hbWVzKFNNQy5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIlNNQyBtYXJrZXJzXG4oU01DIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1Lyhucm93KFNNQy5tYXJrZXJzKSksICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHMgPWMoJ05TJywnYXZnLiBmb2xkLWNoYW5nZScsJ1AnLAogICAgICAnUCAmIGF2Zy4gZm9sZC1jaGFuZ2UnKSwKICAgIGxlZ2VuZFBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgIGxlZ2VuZEljb25TaXplID0gMy4wLAogICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgd2lkdGhDb25uZWN0b3JzID0gMC4yLAogICAgY29sQ29ubmVjdG9ycyA9ICIjNTk1QTVDIiwKICAgIGdyaWRsaW5lcy5tYWpvciA9IEZBTFNFLAogICAgZ3JpZGxpbmVzLm1pbm9yID0gRkFMU0UpClNNQ19Wb2xjYW5vX1RhcmdldHNBCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuVm9sY2Fuby5TTUMuREVHLlRhcmdldHMucGRmIiksIAogICAgICAgcGxvdCA9IFNNQ19Wb2xjYW5vX1RhcmdldHNBKQpgYGAKClRoZSB0YXJnZXQgcmVzdWx0cyBhcmUgZ2l2ZW4gYmVsb3cgYW5kIHdyaXR0ZW4gdG8gYSBmaWxlLgoKYGBge3IgUmVzdWx0cyBTTUN9CmxpYnJhcnkodGliYmxlKQpTTUMubWFya2VycyA8LSBhZGRfY29sdW1uKFNNQy5tYXJrZXJzLCBHZW5lID0gcm93Lm5hbWVzKFNNQy5tYXJrZXJzKSwgLmJlZm9yZSA9IDEpCgp0ZW1wIDwtIFNNQy5tYXJrZXJzW1NNQy5tYXJrZXJzJEdlbmUgJWluJSB0YXJnZXRfZ2VuZXNfcWMsXQoKRFQ6OmRhdGF0YWJsZSh0ZW1wKQpgYGAKCmBgYHtyIFJlc3VsdHMgU01DOiB3cml0aW5nfQpmd3JpdGUodGVtcCwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLlNNQy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKIyMjIyBFbmRvdGhlbGlhbCBjZWxscwoKQ29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBlbmRvdGhlbGlhbCBjZWxsIGNvbW11bml0aWVzICgqQ0QzNCo8c3VwPis8L3N1cD4pLCBhbmQKYWxsIG90aGVyIGNvbW11bml0aWVzLgoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBFQyBjYWxjdWxhdGV9CgpFQy5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHNjUk5Bc2VxRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMSA9IGMoIkNEMzQrIEVDIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSUkiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoIkNENjgrQ0FTUDErSUwxQitTRUxMIE1JbmYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtDRDFDKyBEQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0NENCsgTW9ubyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrSUwxOCtUTFI0K1RSRU0yKyBNUmVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtBQkNBMStPTFIxK1RSRU0yKyBGQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJViIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIFYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBWSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGT1hQMysgVEMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDM0KyBFQyBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiQ0QzNCsgRUMgSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQ1RBMisgU01DIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDU2KyBOSyBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENTYrIE5LIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrS0lUKyBNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzkrIEJDcGxhc21hIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCQ21lbSIpKQoKRFQ6OmRhdGF0YWJsZShFQy5tYXJrZXJzKQpgYGAKCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gRUMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkVDX1ZvbGNhbm9fVGFyZ2V0c0EgPSBFbmhhbmNlZFZvbGNhbm8oRUMubWFya2VycywKICAgIGxhYiA9IHJvd25hbWVzKEVDLm1hcmtlcnMpLAogICAgeCA9ICJhdmdfbG9nMkZDIiwKICAgIHkgPSAicF92YWxfYWRqIiwKICAgIHNlbGVjdExhYiA9IHRhcmdldF9nZW5lc19xYywKICAgIGF4aXNMYWJTaXplID0gMTIsCiAgICB4bGFiID0gImF2ZXJhZ2UgZm9sZC1jaGFuZ2UiLAogICAgdGl0bGUgPSAiRW5kb3RoZWxpYWwgY2VsbCBtYXJrZXJzXG4oRUMgY29tbXVuaXRpZXMgdnMgdGhlIHJlc3QpIiwKICAgIHRpdGxlTGFiU2l6ZSA9IDE0LAogICAgcEN1dG9mZiA9IDAuMDUvKG5yb3coRUMubWFya2VycykpLCAjIDIwNTUyIGdlbmVzCiAgICBGQ2N1dG9mZiA9IDEuMjUsCiAgICBwb2ludFNpemUgPSAxLjUsCiAgICBsYWJTaXplID0gMy4wLAogICAgbGVnZW5kTGFiZWxzID1jKCdOUycsJ2F2Zy4gZm9sZC1jaGFuZ2UnLCdQJywKICAgICAgJ1AgJiBhdmcuIGZvbGQtY2hhbmdlJyksCiAgICBsZWdlbmRQb3NpdGlvbiA9ICJyaWdodCIsCiAgICBsZWdlbmRMYWJTaXplID0gMTAsCiAgICBsZWdlbmRJY29uU2l6ZSA9IDMuMCwKICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwKICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuMiwKICAgIGNvbENvbm5lY3RvcnMgPSAiIzU5NUE1QyIsCiAgICBncmlkbGluZXMubWFqb3IgPSBGQUxTRSwKICAgIGdyaWRsaW5lcy5taW5vciA9IEZBTFNFKQpFQ19Wb2xjYW5vX1RhcmdldHNBCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuVm9sY2Fuby5FQy5ERUcuVGFyZ2V0cy5wZGYiKSwgCiAgICAgICBwbG90ID0gRUNfVm9sY2Fub19UYXJnZXRzQSkKYGBgCgpUaGUgdGFyZ2V0IHJlc3VsdHMgYXJlIGdpdmVuIGJlbG93IGFuZCB3cml0dGVuIHRvIGEgZmlsZS4KCmBgYHtyIFJlc3VsdHMgRUN9CmxpYnJhcnkodGliYmxlKQpFQy5tYXJrZXJzIDwtIGFkZF9jb2x1bW4oRUMubWFya2VycywgR2VuZSA9IHJvdy5uYW1lcyhFQy5tYXJrZXJzKSwgLmJlZm9yZSA9IDEpCgp0ZW1wIDwtIEVDLm1hcmtlcnNbRUMubWFya2VycyRHZW5lICVpbiUgdGFyZ2V0X2dlbmVzX3FjLF0KCkRUOjpkYXRhdGFibGUodGVtcCkKYGBgCgpgYGB7ciBSZXN1bHRzIEVDOiB3cml0aW5nfQpmd3JpdGUodGVtcCwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLkVDLkRFRy5UYXJnZXRzLnR4dCIpLAogICAgICAgcXVvdGUgPSBGQUxTRSwKICAgICAgIHNlcCA9ICJcdCIsIAogICAgICAgc2hvd1Byb2dyZXNzID0gRkFMU0UsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgojIyMjIFQtY2VsbHMKCkNvbXBhcmlzb24gYmV0d2VlbiB0aGUgVC1jZWxsIGNvbW11bml0aWVzICgqQ0QzL0NENC9DRDgqPHN1cD4rPC9zdXA+KSwgYW5kIGFsbApvdGhlciBjb21tdW5pdGllcy4KCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gVGNlbGwgY2FsY3VsYXRlfQoKVEMubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKCJDRDMrIFRDIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSUlJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSVYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBWIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgVkkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRk9YUDMrIFRDIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjIgPSBjKCJDRDY4K0NBU1AxK0lMMUIrU0VMTCBNSW5mIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrQ0QxQysgREMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtDRDQrIE1vbm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0lMMTgrVExSNCtUUkVNMisgTVJlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrQUJDQTErT0xSMStUUkVNMisgRkMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMysgVEMgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiQ0QzKyBUQyBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMysgVEMgSUlJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiQ0QzKyBUQyBJViIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMysgVEMgViIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMysgVEMgVkkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJGT1hQMysgVEMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFDVEEyKyBTTUMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENTYrIE5LIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q1NisgTksgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtLSVQrIE1DIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OSsgQkNwbGFzbWEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEJDbWVtIikpCgpEVDo6ZGF0YXRhYmxlKFRDLm1hcmtlcnMpCmBgYAoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBUY2VsbCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KVENfVm9sY2Fub19UYXJnZXRzQSA9IEVuaGFuY2VkVm9sY2FubyhUQy5tYXJrZXJzLAogICAgbGFiID0gcm93bmFtZXMoVEMubWFya2VycyksCiAgICB4ID0gImF2Z19sb2cyRkMiLAogICAgeSA9ICJwX3ZhbF9hZGoiLAogICAgc2VsZWN0TGFiID0gdGFyZ2V0X2dlbmVzX3FjLAogICAgYXhpc0xhYlNpemUgPSAxMiwKICAgIHhsYWIgPSAiYXZlcmFnZSBmb2xkLWNoYW5nZSIsCiAgICB0aXRsZSA9ICJULWNlbGwgbWFya2Vyc1xuKFQtY2VsbCBjb21tdW5pdGllcyB2cyB0aGUgcmVzdCkiLAogICAgdGl0bGVMYWJTaXplID0gMTQsCiAgICBwQ3V0b2ZmID0gMC4wNS9ucm93KFRDLm1hcmtlcnMpLCAjIDIwNTUyIGdlbmVzCiAgICBGQ2N1dG9mZiA9IDEuMjUsCiAgICBwb2ludFNpemUgPSAxLjUsCiAgICBsYWJTaXplID0gMy4wLAogICAgbGVnZW5kTGFiZWxzID1jKCdOUycsJ2F2Zy4gZm9sZC1jaGFuZ2UnLCdQJywKICAgICAgJ1AgJiBhdmcuIGZvbGQtY2hhbmdlJyksCiAgICBsZWdlbmRQb3NpdGlvbiA9ICJyaWdodCIsCiAgICBsZWdlbmRMYWJTaXplID0gMTAsCiAgICBsZWdlbmRJY29uU2l6ZSA9IDMuMCwKICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwKICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuMiwKICAgIGNvbENvbm5lY3RvcnMgPSAiIzU5NUE1QyIsCiAgICBncmlkbGluZXMubWFqb3IgPSBGQUxTRSwKICAgIGdyaWRsaW5lcy5taW5vciA9IEZBTFNFKQpUQ19Wb2xjYW5vX1RhcmdldHNBCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuVm9sY2Fuby5UQy5ERUcuVGFyZ2V0cy5wZGYiKSwgCiAgICAgICBwbG90ID0gVENfVm9sY2Fub19UYXJnZXRzQSkKYGBgCgpUaGUgdGFyZ2V0IHJlc3VsdHMgYXJlIGdpdmVuIGJlbG93IGFuZCB3cml0dGVuIHRvIGEgZmlsZS4KCmBgYHtyIFJlc3VsdHMgVEN9CmxpYnJhcnkodGliYmxlKQpUQy5tYXJrZXJzIDwtIGFkZF9jb2x1bW4oVEMubWFya2VycywgR2VuZSA9IHJvdy5uYW1lcyhUQy5tYXJrZXJzKSwgLmJlZm9yZSA9IDEpCgp0ZW1wIDwtIFRDLm1hcmtlcnNbVEMubWFya2VycyRHZW5lICVpbiUgdGFyZ2V0X2dlbmVzX3FjLF0KCkRUOjpkYXRhdGFibGUodGVtcCkKYGBgCgpgYGB7ciBSZXN1bHRzIFRDOiB3cml0aW5nfQpmd3JpdGUodGVtcCwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLlRDLkRFRy5UYXJnZXRzLnR4dCIpLAogICAgICAgcXVvdGUgPSBGQUxTRSwKICAgICAgIHNlcCA9ICJcdCIsIAogICAgICAgc2hvd1Byb2dyZXNzID0gRkFMU0UsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgojIyMjIEItY2VsbHMKCkNvbXBhcmlzb24gYmV0d2VlbiB0aGUgQi1jZWxsIGNvbW11bml0aWVzICgqQ0Q3OUEqPHN1cD4rPC9zdXA+KSwgYW5kIGFsbCBvdGhlcgpjb21tdW5pdGllcy4KCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gQmNlbGwgY2FsY3VsYXRlfQoKQkMubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKCJDRDc5KyBCQ3BsYXNtYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQkNtZW0iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoIkNENjgrQ0FTUDErSUwxQitTRUxMIE1JbmYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtDRDFDKyBEQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0NENCsgTW9ubyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrSUwxOCtUTFI0K1RSRU0yKyBNUmVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtBQkNBMStPTFIxK1RSRU0yKyBGQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJViIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIFYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBWSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGT1hQMysgVEMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFDVEEyKyBTTUMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENTYrIE5LIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q1NisgTksgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtLSVQrIE1DIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNENzkrIEJDcGxhc21hIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiQ0Q3OUErIEJDbWVtIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCgpEVDo6ZGF0YXRhYmxlKEJDLm1hcmtlcnMpCmBgYAoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBCY2VsbCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQkNfVm9sY2Fub19UYXJnZXRzQSA9IEVuaGFuY2VkVm9sY2FubyhCQy5tYXJrZXJzLAogICAgbGFiID0gcm93bmFtZXMoQkMubWFya2VycyksCiAgICB4ID0gImF2Z19sb2cyRkMiLAogICAgeSA9ICJwX3ZhbF9hZGoiLAogICAgc2VsZWN0TGFiID0gdGFyZ2V0X2dlbmVzX3FjLAogICAgYXhpc0xhYlNpemUgPSAxMiwKICAgIHhsYWIgPSAiYXZlcmFnZSBmb2xkLWNoYW5nZSIsCiAgICB0aXRsZSA9ICJCLWNlbGwgbWFya2Vyc1xuKEItY2VsbCBjb21tdW5pdGllcyB2cyB0aGUgcmVzdCkiLAogICAgdGl0bGVMYWJTaXplID0gMTQsCiAgICBwQ3V0b2ZmID0gMC4wNS9ucm93KEJDLm1hcmtlcnMpLCAjIDIwNTUyIGdlbmVzCiAgICBGQ2N1dG9mZiA9IDEuMjUsCiAgICBwb2ludFNpemUgPSAxLjUsCiAgICBsYWJTaXplID0gMy4wLAogICAgbGVnZW5kTGFiZWxzID1jKCdOUycsJ2F2Zy4gZm9sZC1jaGFuZ2UnLCdQJywKICAgICAgJ1AgJiBhdmcuIGZvbGQtY2hhbmdlJyksCiAgICBsZWdlbmRQb3NpdGlvbiA9ICJyaWdodCIsCiAgICBsZWdlbmRMYWJTaXplID0gMTAsCiAgICBsZWdlbmRJY29uU2l6ZSA9IDMuMCwKICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwKICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuMiwKICAgIGNvbENvbm5lY3RvcnMgPSAiIzU5NUE1QyIsCiAgICBncmlkbGluZXMubWFqb3IgPSBGQUxTRSwKICAgIGdyaWRsaW5lcy5taW5vciA9IEZBTFNFKQpCQ19Wb2xjYW5vX1RhcmdldHNBCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuVm9sY2Fuby5CQy5ERUcuVGFyZ2V0cy5wZGYiKSwgCiAgICAgICBwbG90ID0gQkNfVm9sY2Fub19UYXJnZXRzQSkKYGBgCgpUaGUgdGFyZ2V0IHJlc3VsdHMgYXJlIGdpdmVuIGJlbG93IGFuZCB3cml0dGVuIHRvIGEgZmlsZS4KCmBgYHtyIFJlc3VsdHMgQkN9CmxpYnJhcnkodGliYmxlKQpCQy5tYXJrZXJzIDwtIGFkZF9jb2x1bW4oQkMubWFya2VycywgR2VuZSA9IHJvdy5uYW1lcyhCQy5tYXJrZXJzKSwgLmJlZm9yZSA9IDEpCgp0ZW1wIDwtIEJDLm1hcmtlcnNbQkMubWFya2VycyRHZW5lICVpbiUgdGFyZ2V0X2dlbmVzX3FjLF0KCkRUOjpkYXRhdGFibGUodGVtcCkKYGBgCgpgYGB7ciBSZXN1bHRzIEJDOiB3cml0aW5nfQpmd3JpdGUodGVtcCwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLkJDLkRFRy5UYXJnZXRzLnR4dCIpLAogICAgICAgcXVvdGUgPSBGQUxTRSwKICAgICAgIHNlcCA9ICJcdCIsIAogICAgICAgc2hvd1Byb2dyZXNzID0gRkFMU0UsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgojIyMjIE1hc3QgY2VsbHMKCkNvbXBhcmlzb24gYmV0d2VlbiB0aGUgbWFzdCBjZWxsIGNvbW11bml0aWVzICgqS0lUKjxzdXA+Kzwvc3VwPiksIGFuZCBhbGwgb3RoZXIKY29tbXVuaXRpZXMuCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIE1hc3QgY2FsY3VsYXRlfQoKTUMubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKCJDRDY4K0tJVCsgTUMiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoIkNENjgrQ0FTUDErSUwxQitTRUxMIE1JbmYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtDRDFDKyBEQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0NENCsgTW9ubyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrSUwxOCtUTFI0K1RSRU0yKyBNUmVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtBQkNBMStPTFIxK1RSRU0yKyBGQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJViIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIFYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBWSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGT1hQMysgVEMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFDVEEyKyBTTUMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENTYrIE5LIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q1NisgTksgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDY4K0tJVCsgTUMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5KyBCQ3BsYXNtYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQkNtZW0iKSkKCkRUOjpkYXRhdGFibGUoTUMubWFya2VycykKYGBgCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIE1hc3QsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Ck1DX1ZvbGNhbm9fVGFyZ2V0c0EgPSBFbmhhbmNlZFZvbGNhbm8oTUMubWFya2VycywKICAgIGxhYiA9IHJvd25hbWVzKE1DLm1hcmtlcnMpLAogICAgeCA9ICJhdmdfbG9nMkZDIiwKICAgIHkgPSAicF92YWxfYWRqIiwKICAgIHNlbGVjdExhYiA9IHRhcmdldF9nZW5lc19xYywKICAgIGF4aXNMYWJTaXplID0gMTIsCiAgICB4bGFiID0gImF2ZXJhZ2UgZm9sZC1jaGFuZ2UiLAogICAgdGl0bGUgPSAiTWFzdCBjZWxsIG1hcmtlcnNcbihNYXN0IGNlbGwgY29tbXVuaXRpZXMgdnMgdGhlIHJlc3QpIiwKICAgIHRpdGxlTGFiU2l6ZSA9IDE0LAogICAgcEN1dG9mZiA9IDAuMDUvbnJvdyhNQy5tYXJrZXJzKSwgIyAyMDU1MiBnZW5lcwogICAgRkNjdXRvZmYgPSAxLjI1LAogICAgcG9pbnRTaXplID0gMS41LAogICAgbGFiU2l6ZSA9IDMuMCwKICAgIGxlZ2VuZExhYmVscyA9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKTUNfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uTUMuREVHLlRhcmdldHMucGRmIiksIAogICAgICAgcGxvdCA9IE1DX1ZvbGNhbm9fVGFyZ2V0c0EpCmBgYAoKVGhlIHRhcmdldCByZXN1bHRzIGFyZSBnaXZlbiBiZWxvdyBhbmQgd3JpdHRlbiB0byBhIGZpbGUuCgpgYGB7ciBSZXN1bHRzIE1DfQpsaWJyYXJ5KHRpYmJsZSkKTUMubWFya2VycyA8LSBhZGRfY29sdW1uKE1DLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoTUMubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBNQy5tYXJrZXJzW01DLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBNQzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5NQy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKIyMjIyBOSy1jZWxscwoKQ29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBuYXR1cmFsIGtpbGxlciBjZWxsIGNvbW11bml0aWVzICgqTkNBTTEqPHN1cD4rPC9zdXA+KSwKYW5kIGFsbCBvdGhlciBjb21tdW5pdGllcy4KCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gTksgY2FsY3VsYXRlfQoKTksubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKCJDRDMrQ0Q1NisgTksgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDU2KyBOSyBJSSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygiQ0Q2OCtDQVNQMStJTDFCK1NFTEwgTUluZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0NEMUMrIERDIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrQ0Q0KyBNb25vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtJTDE4K1RMUjQrVFJFTTIrIE1SZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0FCQ0ExK09MUjErVFJFTTIrIEZDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIElWIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgViIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIFZJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZPWFAzKyBUQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIElJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUNUQTIrIFNNQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMytDRDU2KyBOSyBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDMrQ0Q1NisgTksgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtLSVQrIE1DIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OSsgQkNwbGFzbWEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEJDbWVtIikpCgpEVDo6ZGF0YXRhYmxlKE5LLm1hcmtlcnMpCmBgYAoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBOSywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KTktfVm9sY2Fub19UYXJnZXRzQSA9IEVuaGFuY2VkVm9sY2FubyhOSy5tYXJrZXJzLAogICAgbGFiID0gcm93bmFtZXMoTksubWFya2VycyksCiAgICB4ID0gImF2Z19sb2cyRkMiLAogICAgeSA9ICJwX3ZhbF9hZGoiLAogICAgc2VsZWN0TGFiID0gdGFyZ2V0X2dlbmVzX3FjLAogICAgYXhpc0xhYlNpemUgPSAxMiwKICAgIHhsYWIgPSAiYXZlcmFnZSBmb2xkLWNoYW5nZSIsCiAgICB0aXRsZSA9ICJOSyBtYXJrZXJzXG4oTkstY2VsbCBjb21tdW5pdGllcyB2cyB0aGUgcmVzdCkiLAogICAgdGl0bGVMYWJTaXplID0gMTQsCiAgICBwQ3V0b2ZmID0gMC4wNS9ucm93KE5LLm1hcmtlcnMpLCAjIDIwNTUyIGdlbmVzCiAgICBGQ2N1dG9mZiA9IDEuMjUsCiAgICBwb2ludFNpemUgPSAxLjUsCiAgICBsYWJTaXplID0gMy4wLAogICAgbGVnZW5kTGFiZWxzID1jKCdOUycsJ2F2Zy4gZm9sZC1jaGFuZ2UnLCdQJywKICAgICAgJ1AgJiBhdmcuIGZvbGQtY2hhbmdlJyksCiAgICBsZWdlbmRQb3NpdGlvbiA9ICJyaWdodCIsCiAgICBsZWdlbmRMYWJTaXplID0gMTAsCiAgICBsZWdlbmRJY29uU2l6ZSA9IDMuMCwKICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwKICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuMiwKICAgIGNvbENvbm5lY3RvcnMgPSAiIzU5NUE1QyIsCiAgICBncmlkbGluZXMubWFqb3IgPSBGQUxTRSwKICAgIGdyaWRsaW5lcy5taW5vciA9IEZBTFNFKQpOS19Wb2xjYW5vX1RhcmdldHNBCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuVm9sY2Fuby5OSy5ERUcuVGFyZ2V0cy5wZGYiKSwgCiAgICAgICBwbG90ID0gTktfVm9sY2Fub19UYXJnZXRzQSkKYGBgCgpUaGUgdGFyZ2V0IHJlc3VsdHMgYXJlIGdpdmVuIGJlbG93IGFuZCB3cml0dGVuIHRvIGEgZmlsZS4KCmBgYHtyIFJlc3VsdHMgTkt9CmxpYnJhcnkodGliYmxlKQpOSy5tYXJrZXJzIDwtIGFkZF9jb2x1bW4oTksubWFya2VycywgR2VuZSA9IHJvdy5uYW1lcyhOSy5tYXJrZXJzKSwgLmJlZm9yZSA9IDEpCgp0ZW1wIDwtIE5LLm1hcmtlcnNbTksubWFya2VycyRHZW5lICVpbiUgdGFyZ2V0X2dlbmVzX3FjLF0KCkRUOjpkYXRhdGFibGUodGVtcCkKYGBgCgpgYGB7ciBSZXN1bHRzIE5LOiB3cml0aW5nfQpmd3JpdGUodGVtcCwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLk5LLkRFRy5UYXJnZXRzLnR4dCIpLAogICAgICAgcXVvdGUgPSBGQUxTRSwKICAgICAgIHNlcCA9ICJcdCIsIAogICAgICAgc2hvd1Byb2dyZXNzID0gRkFMU0UsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgojIFN1YnNldCBzY1JOQXNlcSBkYXRhCgpMaXN0IG9mIHNhbXBsZXMgdG8gYmUgaW5jbHVkZWQgYmFzZWQgb24gaW5mb3JtZWQgY29uc2VudCAoc2VlIGFib3ZlKS4KCmBgYHtyfQpzYW1wbGVzX29mX2ludGVyZXN0IDwtIHVubGlzdChzY1JOQXNlcURhdGFNZXRhQUUuYWxsJFBhdGllbnQpCgpgYGAKCmBgYHtyfQpzY1JOQXNlcURhdGFDRUEzOSA8LSBzdWJzZXQoc2NSTkFzZXFEYXRhLCBzdWJzZXQgPSBQYXRpZW50ICVpbiUgc2FtcGxlc19vZl9pbnRlcmVzdCkKYGBgCgpgYGB7cn0KdmFyaWFibGVzX29mX2ludGVyZXN0IDwtIGMoIkhvc3BpdGFsIiwgIk9SeWVhciIsICJBcnRlcnlfc3VtbWFyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZ2UiLCAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRDX2ZpbmFsIiwgIkxETF9maW5hbCIsICJIRExfZmluYWwiLCAiVEdfZmluYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzdG9saWMiLCAiZGlhc3RvbGkiLCAiR0ZSX01EUkQiLCAiQk1JIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIktET1FJIiwgIkJNSV9XSE8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiU21va2VyU3RhdHVzIiwgIkFsY29ob2xVc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlhYmV0ZXNTdGF0dXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQiLCAiSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnRkcnVnIiwgIkh5cGVydGVuc2lvbi5jb21wb3NpdGUiLCAiSHlwZXJ0ZW5zaW9uLmRydWdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lZC5hbnRpY29hZ3VsYW50cyIsICJNZWQuYWxsLmFudGlwbGF0ZWxldCIsICJNZWQuU3RhdGluLkxMRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJva2VfRHgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3ltcHQiLCAiU3ltcHRvbXMuNUciLCAiQXN5bXB0U3ltcHQiLCAiQXN5bXB0U3ltcHQyRyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJTeW1wdG9tcy5VcGRhdGUyRyIsICJTeW1wdG9tcy5VcGRhdGUzRyIsICJpbmRleHN5bXB0b21zX2xhdGVzdF80ZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXN0ZW5vcyIsICJzdGVub3NlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNBRF9oaXN0b3J5IiwgIlBBT0QiLCAiUGVyaXBoZXJhbC5pbnRlcnYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiRVBfY29tcG9zaXRlIiwgIkVQX2NvbXBvc2l0ZV90aW1lIiwgIkVQX21ham9yIiwgIkVQX21ham9yX3RpbWUiKQoKdGVtcCA8LSBzdWJzZXQoc2NSTkFzZXFEYXRhTWV0YUFFLmFsbCwgc2VsZWN0ID0gYygiUGF0aWVudCIsIHZhcmlhYmxlc19vZl9pbnRlcmVzdCkpCiMgc3RyKHRlbXApCgpgYGAKCmBgYHtyfQpzY1JOQXNlcURhdGFDRUEzOUBtZXRhLmRhdGEgPC0gbWVyZ2Uoc2NSTkFzZXFEYXRhQ0VBMzlAbWV0YS5kYXRhLCB0ZW1wLCBieS54ID0gIlBhdGllbnQiLCBieS55ID0gIlBhdGllbnQiKQpzY1JOQXNlcURhdGFDRUEzOUBtZXRhLmRhdGEgPC0gZHBseXI6OnJlbmFtZShzY1JOQXNlcURhdGFDRUEzOUBtZXRhLmRhdGEsICJTVFVEWV9OVU1CRVIiID0gIlBhdGllbnQiKQoKIyBzdHIoc2NSTkFzZXFEYXRhQ0VBMzlAbWV0YS5kYXRhKQoKYGBgCgojIyBTYXZpbmcgbmV3IGRhdGFzZXQKCmBgYHtyfQp0ZW1wMiA8LSBhc190aWJibGUoc3Vic2V0KHNjUk5Bc2VxRGF0YUNFQTM5QG1ldGEuZGF0YSwgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIm9yaWcuaWRlbnQiLCAibkNvdW50X1JOQSIsICJuRmVhdHVyZV9STkEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGF0ZSIsICJCYXRjaCIsICJDLkgiLCAiVHlwZSIsICJwZXJjZW50Lm10IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibkNvdW50X1NDVCIsICJuRmVhdHVyZV9TQ1QiLCAic2V1cmF0X2NsdXN0ZXJzIikpKQoKIyBmd3JpdGUodGVtcDIsCiMgICAgICAgIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5BRVNDUk5BLkNFQS4zOXB0cy5zYW1wbGVsaXN0LmFmdGVyX3FjLklDX2NvbW1lcmNpYWwuY3N2IiksCiMgICAgICAgIHNlcCA9ICIsIiwgcm93Lm5hbWVzID0gRkFMU0UsIGNvbC5uYW1lcyA9IFRSVUUsCiMgICAgICAgIHNob3dQcm9ncmVzcyA9IFRSVUUpCiMgcm0odGVtcDIpCiMgCiMgdGVtcCA8LSBkcGx5cjo6cmVuYW1lKHRlbXAsICJTVFVEWV9OVU1CRVIiID0gIlBhdGllbnQiKQojIGZ3cml0ZSh0ZW1wLAojICAgICAgICBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIiwgVG9kYXksICIuQUVTQ1JOQS5DRUEuMzlwdHMuY2xpbmljYWxkYXRhLmFmdGVyX3FjLklDX2NvbW1lcmNpYWwuY3N2IiksCiMgICAgICAgIHNlcCA9ICIsIiwgcm93Lm5hbWVzID0gRkFMU0UsIGNvbC5uYW1lcyA9IFRSVUUsCiMgICAgICAgIHNob3dQcm9ncmVzcyA9IFRSVUUpCiMgcm0odGVtcCkKIyAKIyBzYXZlUkRTKHNjUk5Bc2VxRGF0YUNFQTM5LCBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIiwgVG9kYXksICIuQUVTQ1JOQS5DRUEuMzlwdHMuU2V1cmF0LmFmdGVyX3FjLklDX2NvbW1lcmNpYWwuUkRTIikpCgpmd3JpdGUodGVtcDIsCiAgICAgICBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIiwgVG9kYXksICIuQUVTQ1JOQS5DRUEuMzlwdHMuc2FtcGxlbGlzdC5hZnRlcl9xYy5JQ19hY2FkZW1pYy5jc3YiKSwKICAgICAgIHNlcCA9ICIsIiwgcm93Lm5hbWVzID0gRkFMU0UsIGNvbC5uYW1lcyA9IFRSVUUsCiAgICAgICBzaG93UHJvZ3Jlc3MgPSBUUlVFKQpybSh0ZW1wMikKCnRlbXAgPC0gZHBseXI6OnJlbmFtZSh0ZW1wLCAiU1RVRFlfTlVNQkVSIiA9ICJQYXRpZW50IikKZndyaXRlKHRlbXAsCiAgICAgICBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIiwgVG9kYXksICIuQUVTQ1JOQS5DRUEuMzlwdHMuY2xpbmljYWxkYXRhLmFmdGVyX3FjLklDX2FjYWRlbWljLmNzdiIpLAogICAgICAgc2VwID0gIiwiLCByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSwKICAgICAgIHNob3dQcm9ncmVzcyA9IFRSVUUpCnJtKHRlbXApCgpzYXZlUkRTKHNjUk5Bc2VxRGF0YUNFQTM5LCBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIiwgVG9kYXksICIuQUVTQ1JOQS5DRUEuMzlwdHMuU2V1cmF0LmFmdGVyX3FjLklDX2FjYWRlbWljLlJEUyIpKQoKYGBgCgoKIyBTZXNzaW9uIGluZm9ybWF0aW9uCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIFZlcnNpb246ICAgICAgdjEuMS4xCiAgICBMYXN0IHVwZGF0ZTogIDIwMjMtMDYtMTQKICAgIFdyaXR0ZW4gYnk6ICAgU2FuZGVyIFcuIHZhbiBkZXIgTGFhbiAocy53LnZhbmRlcmxhYW4tMlthdF11bWN1dHJlY2h0Lm5sKS4KICAgIERlc2NyaXB0aW9uOiAgU2NyaXB0IHRvIGxvYWQgc2luZ2xlLWNlbGwgUk5BIHNlcXVlbmNpbmcgKHNjUk5Bc2VxKSBkYXRhLCBhbmQgcGVyZm9ybSBxdWFsaXR5IGNvbnRyb2wgKFFDKSwgYW5kIGluaXRpYWwgbWFwcGluZyB0byBjZWxscy4KICAgIE1pbmltdW0gcmVxdWlyZW1lbnRzOiBSIHZlcnNpb24gMy41LjIgKDIwMTgtMTItMjApIC0tICdFZ2dzaGVsbCBJZ2xvbycsIG1hY09TIE1vamF2ZSAoMTAuMTQuMikuCgogICAgKipNb1NDb1cgVG8tRG8gTGlzdCoqCiAgICBUaGUgdGhpbmdzIHdlIE11c3QsIFNob3VsZCwgQ291bGQsIGFuZCBXb3VsZCBoYXZlIGdpdmVuIHRoZSB0aW1lIHdlIGhhdmUuCiAgICBfTV8KCiAgICBfU18KCiAgICBfQ18KCiAgICBfV18KCiAgICAqKkNoYW5nZXMgbG9nKioKICAgICogdjEuMS4xIEZpeCB3cml0aW5nIGJhc2VsaW5lIHRhYmxlLgogICAgKiB2MS4xLjAgVXBkYXRlIHRvIHN0dWR5IGRhdGFiYXNlLgogICAgKiB2MS4wLjIgRml4ZXMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBub3RlYm9vay4gVXBkYXRlIHRvIGxvYWRpbmcgb2YgdGhlIGNsaW5pY2FsIGRhdGEuIEZpeCBvbiB0aGUgZ2VuZS1maWx0ZXJpbmcuCiAgICAqIHYxLjAuMSBVcGRhdGUgdG8gbWFpbiBBRURCICh0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgQWdlLXZhcmlhYmxlIGluIHRoZSBuZXcgdmVyc2lvbikuIEZld2VyIHBhdGllbnRzIGluIHNjUk5Bc2VxICgzMiB2cyAzOSB3aXRoIHRoZSBuZXdlciBkYXRhc2V0KS4KICAgICogdjEuMC4wIEluaXRpYWwgdmVyc2lvbi4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7ciBldmFsID0gVFJVRX0Kc2Vzc2lvbkluZm8oKQpgYGAKCiMgU2F2aW5nIGVudmlyb25tZW50CgpgYGB7ciBTYXZpbmd9CnJtKGJhY2t1cC5zY1JOQXNlcURhdGEpCnJtKHNjUk5Bc2VxRGF0YSwgc2NSTkFzZXFEYXRhQ0VBMzkpCgpzYXZlLmltYWdlKHBhc3RlMChQUk9KRUNUX2xvYywgIi8iLFRvZGF5LCIuIixQUk9KRUNUTkFNRSwiLkFFU0NSTkEucmVzdWx0cy5SRGF0YSIpKQoKYGBgCgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgPHN1cD7CqSAxOTc5LTIwMjMgU2FuZGVyIFcuIHZhbiBkZXIgTGFhbiB8IHMudy52YW5kZXJsYWFuW2F0XWdtYWlsLmNvbSB8IFt2YW5kZXJsYWFuLnNjaWVuY2VdKGh0dHBzOi8vdmFuZGVybGFhbi5zY2llbmNlKS48L3N1cD4gfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCg==